[Scummvm-git-logs] scummvm master -> 75dd6b5103999fe54712d552b374de6df7defd26

djsrv dservilla at gmail.com
Mon Jun 15 13:47:14 UTC 2020


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

Summary:
4109fd0bc6 DIRECTOR: LINGO: Switch variables to DatumHash
75dd6b5103 DIRECTOR: LINGO: Remove variable types from Symbol


Commit: 4109fd0bc66898323474053158778202c035682a
    https://github.com/scummvm/scummvm/commit/4109fd0bc66898323474053158778202c035682a
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-15T09:29:20-04:00

Commit Message:
DIRECTOR: LINGO: Switch variables to DatumHash

Changed paths:
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/lingo/xlibs/fileio.cpp


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 06c58f0554..140e5de11d 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -769,9 +769,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
 			const char *name = _archives[_assemblyArchive].names[index].c_str();
 			debugC(5, kDebugLoading, "%d: %s", i, name);
 			if (!_globalvars.contains(name)) {
-				_globalvars[name] = Symbol();
-				_globalvars[name].name = new Common::String(name);
-				_globalvars[name].global = true;
+				_globalvars[name] = Datum();
 			} else {
 				warning("Global %d (%s) already defined", i, name);
 			}
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index a4bb678102..1f62ddba50 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -224,7 +224,7 @@ void Lingo::pushContext(const Symbol *funcSym, bool preserveVarFrame) {
 	// Functions with an archiveIndex of -1 are anonymous.
 	// Execute them within the current var frame.
 	if (!preserveVarFrame && funcSym && funcSym->archiveIndex >= 0)
-		g_lingo->_localvars = new SymbolHash;
+		g_lingo->_localvars = new DatumHash;
 
 	g_lingo->_callstack.push_back(fp);
 
@@ -1388,7 +1388,7 @@ void LC::call(const Symbol &funcSym, int nargs, Datum target) {
 
 	if (funcSym.archiveIndex >= 0) {
 		// Create new set of local variables
-		SymbolHash *localvars = new SymbolHash;
+		DatumHash *localvars = new DatumHash;
 		if (funcSym.argNames) {
 			int symNArgs = funcSym.nargs;
 			if ((int)funcSym.argNames->size() < symNArgs) {
@@ -1419,8 +1419,7 @@ void LC::call(const Symbol &funcSym, int nargs, Datum target) {
 			for (Common::Array<Common::String>::iterator it = funcSym.varNames->begin(); it != funcSym.varNames->end(); ++it) {
 				Common::String name = *it;
 				if (!localvars->contains(name)) {
-					(*localvars)[name] = Symbol();
-					(*localvars)[name].name = new Common::String(name);
+					(*localvars)[name] = Datum();
 				} else {
 					warning("Variable %s already defined", name.c_str());
 				}
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index d6d3e856bd..1b61c5f84f 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -264,7 +264,7 @@ void Lingo::processIf(int toplabel, int endlabel) {
 	}
 }
 
-void Lingo::varCreate(const Common::String &name, bool global, SymbolHash *localvars) {
+void Lingo::varCreate(const Common::String &name, bool global, DatumHash *localvars) {
 	if (localvars == nullptr) {
 		localvars = _localvars;
 	}
@@ -284,13 +284,11 @@ void Lingo::varCreate(const Common::String &name, bool global, SymbolHash *local
 	}
 
 	if (global) {
-		_globalvars[name] = Symbol();
-		_globalvars[name].name = new Common::String(name);
+		_globalvars[name] = Datum();
 		_globalvars[name].type = INT;
 		_globalvars[name].u.i = 0;
 	} else {
-		(*localvars)[name] = Symbol();
-		(*localvars)[name].name = new Common::String(name);
+		(*localvars)[name] = Datum();
 	}
 }
 
@@ -299,9 +297,7 @@ void Lingo::codeFactory(Common::String &name) {
 
 	_currentFactory = obj;
 	if (!_globalvars.contains(name)) {
-		_globalvars[name] = Symbol();
-		_globalvars[name].name = new Common::String(name);
-		_globalvars[name].global = true;
+		_globalvars[name] = Datum();
 		_globalvars[name].type = OBJECT;
 		_globalvars[name].u.obj = obj;
 	} else {
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index cd7a34ece4..bf4bce2c5b 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.6.2.  */
+/* A Bison parser, made by GNU Bison 3.6.3.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
@@ -49,7 +49,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.6.2"
+#define YYBISON_VERSION "3.6.3"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -112,7 +112,7 @@ static void startDef() {
 	g_lingo->_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
 
 	if (g_lingo->_inFactory) {
-		for (SymbolHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
+		for (DatumHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
 			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
 		}
 	}
@@ -163,8 +163,7 @@ static void mVar(Common::String *s, VarType type) {
 		(*g_lingo->_methodVars)[*s] = type;
 		if (type == kVarInstance) {
 			if (g_lingo->_inFactory) {
-				g_lingo->_currentFactory->properties[*s] = Symbol();
-				g_lingo->_currentFactory->properties[*s].name = new Common::String(*s);
+				g_lingo->_currentFactory->properties[*s] = Datum();
 			} else {
 				warning("Instance var '%s' defined outside factory", s->c_str());
 			}
@@ -175,7 +174,7 @@ static void mVar(Common::String *s, VarType type) {
 }
 
 
-#line 179 "engines/director/lingo/lingo-gr.cpp"
+#line 178 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -312,7 +311,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 162 "engines/director/lingo/lingo-gr.y"
+#line 161 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -332,7 +331,7 @@ union YYSTYPE
 		Common::String *field;
 	} objectref;
 
-#line 336 "engines/director/lingo/lingo-gr.cpp"
+#line 335 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -884,27 +883,27 @@ static const yytype_int8 yytranslate[] =
 };
 
 #if YYDEBUG
-  /* YYRLINEYYN -- Source line where rule number YYN was defined.  */
+  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   221,   221,   222,   224,   225,   226,   228,   235,   239,
-     250,   251,   252,   259,   266,   273,   280,   286,   293,   304,
-     311,   312,   313,   315,   316,   321,   334,   338,   341,   333,
-     368,   372,   375,   367,   402,   409,   415,   401,   445,   453,
-     456,   457,   459,   461,   463,   470,   478,   479,   481,   487,
-     491,   495,   499,   502,   504,   505,   506,   508,   511,   514,
-     518,   522,   526,   534,   540,   541,   542,   553,   554,   555,
-     558,   561,   567,   567,   572,   575,   578,   583,   589,   590,
-     591,   592,   593,   594,   595,   596,   597,   598,   599,   600,
-     601,   602,   603,   604,   605,   606,   607,   608,   609,   610,
-     611,   613,   614,   615,   616,   617,   618,   619,   620,   622,
-     625,   627,   628,   629,   630,   638,   639,   639,   640,   640,
-     641,   641,   642,   645,   648,   649,   651,   654,   658,   663,
-     669,   672,   683,   684,   685,   686,   690,   694,   699,   700,
-     702,   706,   710,   714,   714,   744,   744,   744,   750,   751,
-     751,   757,   765,   771,   771,   774,   775,   776,   778,   779,
-     780,   782,   784,   792,   793,   794,   796,   797,   799,   801,
-     802,   803,   804,   806,   807,   809,   810,   812,   816
+       0,   220,   220,   221,   223,   224,   225,   227,   234,   238,
+     249,   250,   251,   258,   265,   272,   279,   285,   292,   303,
+     310,   311,   312,   314,   315,   320,   333,   337,   340,   332,
+     367,   371,   374,   366,   401,   408,   414,   400,   444,   452,
+     455,   456,   458,   460,   462,   469,   477,   478,   480,   486,
+     490,   494,   498,   501,   503,   504,   505,   507,   510,   513,
+     517,   521,   525,   533,   539,   540,   541,   552,   553,   554,
+     557,   560,   566,   566,   571,   574,   577,   582,   588,   589,
+     590,   591,   592,   593,   594,   595,   596,   597,   598,   599,
+     600,   601,   602,   603,   604,   605,   606,   607,   608,   609,
+     610,   612,   613,   614,   615,   616,   617,   618,   619,   621,
+     624,   626,   627,   628,   629,   637,   638,   638,   639,   639,
+     640,   640,   641,   644,   647,   648,   650,   653,   657,   662,
+     668,   671,   682,   683,   684,   685,   689,   693,   698,   699,
+     701,   705,   709,   713,   713,   743,   743,   743,   749,   750,
+     750,   756,   764,   770,   770,   773,   774,   775,   777,   778,
+     779,   781,   783,   791,   792,   793,   795,   796,   798,   800,
+     801,   802,   803,   805,   806,   808,   809,   811,   815
 };
 #endif
 
@@ -979,7 +978,7 @@ static const yytype_int16 yytoknum[] =
 #define yytable_value_is_error(Yyn) \
   0
 
-  /* YYPACTSTATE-NUM -- Index in YYTABLE of the portion describing
+  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
@@ -1023,7 +1022,7 @@ static const yytype_int16 yypact[] =
     -316,  1625,  -316
 };
 
-  /* YYDEFACTSTATE-NUM -- Default reduction number in state STATE-NUM.
+  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
      Performed when YYTABLE does not specify something else to do.  Zero
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
@@ -1068,7 +1067,7 @@ static const yytype_uint8 yydefact[] =
       29,     0,    33
 };
 
-  /* YYPGOTONTERM-NUM.  */
+  /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
     -316,   120,  -316,  -316,   -16,    15,  -316,  -316,  -316,  -316,
@@ -1079,7 +1078,7 @@ static const yytype_int16 yypgoto[] =
     -272,  -316,    33,   -14,  -316,  -316,  -316,  -316,    58
 };
 
-  /* YYDEFGOTONTERM-NUM.  */
+  /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
       -1,    45,    46,    47,    48,   313,   303,   330,   356,   304,
@@ -1090,7 +1089,7 @@ static const yytype_int16 yydefgoto[] =
      296,    61,   154,    77,    62,   121,   122,   123,   124
 };
 
-  /* YYTABLEYYPACT[STATE-NUM] -- What to do in state STATE-NUM.  If
+  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
      positive, shift that token.  If negative, reduce the rule whose
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
@@ -1627,7 +1626,7 @@ static const yytype_int16 yycheck[] =
       -1,    88,    89,    90,    91,    92,    93,    94
 };
 
-  /* YYSTOSSTATE-NUM -- The (internal number of the) accessing
+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
@@ -1671,7 +1670,7 @@ static const yytype_uint8 yystos[] =
       86,   128,    86
 };
 
-  /* YYR1YYN -- Symbol number of symbol that rule YYN derives.  */
+  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
        0,   103,   104,   104,   105,   105,   105,   106,   106,   106,
@@ -1694,7 +1693,7 @@ static const yytype_uint8 yyr1[] =
      158,   158,   158,   159,   159,   160,   160,   161,   161
 };
 
-  /* YYR2YYN -- Number of symbols on the right hand side of rule YYN.  */
+  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_int8 yyr2[] =
 {
        0,     2,     1,     3,     0,     1,     1,     4,     4,     6,
@@ -1986,81 +1985,81 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1992 "engines/director/lingo/lingo-gr.cpp"
+#line 1991 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1998 "engines/director/lingo/lingo-gr.cpp"
+#line 1997 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2004 "engines/director/lingo/lingo-gr.cpp"
+#line 2003 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2010 "engines/director/lingo/lingo-gr.cpp"
+#line 2009 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2016 "engines/director/lingo/lingo-gr.cpp"
+#line 2015 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2022 "engines/director/lingo/lingo-gr.cpp"
+#line 2021 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2028 "engines/director/lingo/lingo-gr.cpp"
+#line 2027 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2034 "engines/director/lingo/lingo-gr.cpp"
+#line 2033 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2040 "engines/director/lingo/lingo-gr.cpp"
+#line 2039 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2046 "engines/director/lingo/lingo-gr.cpp"
+#line 2045 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2052 "engines/director/lingo/lingo-gr.cpp"
+#line 2051 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
-#line 217 "engines/director/lingo/lingo-gr.y"
+#line 216 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 2058 "engines/director/lingo/lingo-gr.cpp"
+#line 2057 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 149: /* on  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 215 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2064 "engines/director/lingo/lingo-gr.cpp"
+#line 2063 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2339,7 +2338,7 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 228 "engines/director/lingo/lingo-gr.y"
+#line 227 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2347,19 +2346,19 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2351 "engines/director/lingo/lingo-gr.cpp"
+#line 2350 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
-#line 235 "engines/director/lingo/lingo-gr.y"
+#line 234 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2359 "engines/director/lingo/lingo-gr.cpp"
+#line 2358 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
-#line 239 "engines/director/lingo/lingo-gr.y"
+#line 238 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2371,23 +2370,23 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2375 "engines/director/lingo/lingo-gr.cpp"
+#line 2374 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
-#line 250 "engines/director/lingo/lingo-gr.y"
+#line 249 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2381 "engines/director/lingo/lingo-gr.cpp"
+#line 2380 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
-#line 251 "engines/director/lingo/lingo-gr.y"
+#line 250 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2387 "engines/director/lingo/lingo-gr.cpp"
+#line 2386 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
-#line 252 "engines/director/lingo/lingo-gr.y"
+#line 251 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2395,11 +2394,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2399 "engines/director/lingo/lingo-gr.cpp"
+#line 2398 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
-#line 259 "engines/director/lingo/lingo-gr.y"
+#line 258 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2407,11 +2406,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2411 "engines/director/lingo/lingo-gr.cpp"
+#line 2410 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
-#line 266 "engines/director/lingo/lingo-gr.y"
+#line 265 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2419,11 +2418,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2423 "engines/director/lingo/lingo-gr.cpp"
+#line 2422 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
-#line 273 "engines/director/lingo/lingo-gr.y"
+#line 272 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2431,33 +2430,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2435 "engines/director/lingo/lingo-gr.cpp"
+#line 2434 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
-#line 280 "engines/director/lingo/lingo-gr.y"
+#line 279 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2446 "engines/director/lingo/lingo-gr.cpp"
+#line 2445 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
-#line 286 "engines/director/lingo/lingo-gr.y"
+#line 285 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2457 "engines/director/lingo/lingo-gr.cpp"
+#line 2456 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
-#line 293 "engines/director/lingo/lingo-gr.y"
+#line 292 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2469,22 +2468,22 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2473 "engines/director/lingo/lingo-gr.cpp"
+#line 2472 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
-#line 304 "engines/director/lingo/lingo-gr.y"
+#line 303 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectfieldassign);
 		g_lingo->codeString((yyvsp[-2].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2484 "engines/director/lingo/lingo-gr.cpp"
+#line 2483 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25:
-#line 321 "engines/director/lingo/lingo-gr.y"
+#line 320 "engines/director/lingo/lingo-gr.y"
                                                                                                 {
 		inst start = 0, end = 0;
 		WRITE_UINT32(&start, (yyvsp[-6].code) - (yyvsp[-1].code) + 1);
@@ -2492,32 +2491,32 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[(yyvsp[-4].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentAssembly)[(yyvsp[-1].code)] = start;	/* looping back */
 		endRepeat((yyvsp[-1].code) + 1, (yyvsp[-6].code));	}
-#line 2496 "engines/director/lingo/lingo-gr.cpp"
+#line 2495 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26:
-#line 334 "engines/director/lingo/lingo-gr.y"
+#line 333 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2504 "engines/director/lingo/lingo-gr.cpp"
+#line 2503 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27:
-#line 338 "engines/director/lingo/lingo-gr.y"
+#line 337 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2511 "engines/director/lingo/lingo-gr.cpp"
+#line 2510 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28:
-#line 341 "engines/director/lingo/lingo-gr.y"
+#line 340 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2517 "engines/director/lingo/lingo-gr.cpp"
+#line 2516 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
-#line 341 "engines/director/lingo/lingo-gr.y"
+#line 340 "engines/director/lingo/lingo-gr.y"
                                                                                                       {
 
 		int nextPos = g_lingo->_currentAssembly->size();
@@ -2538,32 +2537,32 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = end;	/* end, if cond fails */
 		endRepeat(pos + 1, nextPos); }
-#line 2542 "engines/director/lingo/lingo-gr.cpp"
+#line 2541 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
-#line 368 "engines/director/lingo/lingo-gr.y"
+#line 367 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2550 "engines/director/lingo/lingo-gr.cpp"
+#line 2549 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
-#line 372 "engines/director/lingo/lingo-gr.y"
+#line 371 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2557 "engines/director/lingo/lingo-gr.cpp"
+#line 2556 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
-#line 375 "engines/director/lingo/lingo-gr.y"
+#line 374 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2563 "engines/director/lingo/lingo-gr.cpp"
+#line 2562 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
-#line 376 "engines/director/lingo/lingo-gr.y"
+#line 375 "engines/director/lingo/lingo-gr.y"
                                                                 {
 
 		int nextPos = g_lingo->_currentAssembly->size();
@@ -2584,32 +2583,32 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = end;	/* end, if cond fails */
 		endRepeat(pos + 1, nextPos); }
-#line 2588 "engines/director/lingo/lingo-gr.cpp"
+#line 2587 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
-#line 402 "engines/director/lingo/lingo-gr.y"
+#line 401 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);
 				  g_lingo->codeInt(0);
 				  Common::String count("count");
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2599 "engines/director/lingo/lingo-gr.cpp"
+#line 2598 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
-#line 409 "engines/director/lingo/lingo-gr.y"
+#line 408 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get counter
 				  g_lingo->codeInt(0);
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2609 "engines/director/lingo/lingo-gr.cpp"
+#line 2608 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
-#line 415 "engines/director/lingo/lingo-gr.y"
+#line 414 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get list
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_stackpeek);	// get counter
@@ -2620,11 +2619,11 @@ yyreduce:
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
 				  mVar((yyvsp[-6].s), globalCheck());
 				  g_lingo->code1(LC::c_assign); }
-#line 2624 "engines/director/lingo/lingo-gr.cpp"
+#line 2623 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
-#line 425 "engines/director/lingo/lingo-gr.y"
+#line 424 "engines/director/lingo/lingo-gr.y"
                                                         {
 
 		int nextPos = g_lingo->_currentAssembly->size();
@@ -2644,11 +2643,11 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentAssembly)[(yyvsp[-4].code)] = end;		/* end, if cond fails */
 		endRepeat(end2, nextPos); }
-#line 2648 "engines/director/lingo/lingo-gr.cpp"
+#line 2647 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
-#line 445 "engines/director/lingo/lingo-gr.y"
+#line 444 "engines/director/lingo/lingo-gr.y"
                         {
 		if (g_lingo->_repeatStack.size()) {
 			g_lingo->code2(LC::c_jump, 0);
@@ -2657,43 +2656,43 @@ yyreduce:
 		} else {
 			warning("# LINGO: next repeat not inside repeat block");
 		} }
-#line 2661 "engines/director/lingo/lingo-gr.cpp"
+#line 2660 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
-#line 453 "engines/director/lingo/lingo-gr.y"
+#line 452 "engines/director/lingo/lingo-gr.y"
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2669 "engines/director/lingo/lingo-gr.cpp"
+#line 2668 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
-#line 456 "engines/director/lingo/lingo-gr.y"
+#line 455 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2675 "engines/director/lingo/lingo-gr.cpp"
+#line 2674 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
-#line 457 "engines/director/lingo/lingo-gr.y"
+#line 456 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2681 "engines/director/lingo/lingo-gr.cpp"
+#line 2680 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
-#line 459 "engines/director/lingo/lingo-gr.y"
+#line 458 "engines/director/lingo/lingo-gr.y"
                                 { startRepeat(); }
-#line 2687 "engines/director/lingo/lingo-gr.cpp"
+#line 2686 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
-#line 461 "engines/director/lingo/lingo-gr.y"
+#line 460 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2693 "engines/director/lingo/lingo-gr.cpp"
+#line 2692 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
-#line 463 "engines/director/lingo/lingo-gr.y"
+#line 462 "engines/director/lingo/lingo-gr.y"
                                                                                          {
 		inst else1 = 0, end3 = 0;
 		WRITE_UINT32(&else1, (yyvsp[-3].code) + 1 - (yyvsp[-6].code) + 1);
@@ -2701,11 +2700,11 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2705 "engines/director/lingo/lingo-gr.cpp"
+#line 2704 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 45:
-#line 470 "engines/director/lingo/lingo-gr.y"
+#line 469 "engines/director/lingo/lingo-gr.y"
                                                                                                           {
 		inst else1 = 0, end = 0;
 		WRITE_UINT32(&else1, (yyvsp[-5].code) + 1 - (yyvsp[-8].code) + 1);
@@ -2713,107 +2712,107 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentAssembly)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2717 "engines/director/lingo/lingo-gr.cpp"
+#line 2716 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
-#line 481 "engines/director/lingo/lingo-gr.y"
+#line 480 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		inst else1 = 0;
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2727 "engines/director/lingo/lingo-gr.cpp"
+#line 2726 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
-#line 487 "engines/director/lingo/lingo-gr.y"
+#line 486 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentAssembly->size() - 1; }
-#line 2735 "engines/director/lingo/lingo-gr.cpp"
+#line 2734 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50:
-#line 491 "engines/director/lingo/lingo-gr.y"
+#line 490 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentAssembly->size() - 1; }
-#line 2743 "engines/director/lingo/lingo-gr.cpp"
+#line 2742 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51:
-#line 495 "engines/director/lingo/lingo-gr.y"
+#line 494 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentAssembly->size() - 1; }
-#line 2751 "engines/director/lingo/lingo-gr.cpp"
+#line 2750 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
-#line 499 "engines/director/lingo/lingo-gr.y"
+#line 498 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2758 "engines/director/lingo/lingo-gr.cpp"
+#line 2757 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
-#line 502 "engines/director/lingo/lingo-gr.y"
+#line 501 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentAssembly->size(); }
-#line 2764 "engines/director/lingo/lingo-gr.cpp"
+#line 2763 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 54:
-#line 504 "engines/director/lingo/lingo-gr.y"
+#line 503 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentAssembly->size(); }
-#line 2770 "engines/director/lingo/lingo-gr.cpp"
+#line 2769 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
-#line 508 "engines/director/lingo/lingo-gr.y"
+#line 507 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2778 "engines/director/lingo/lingo-gr.cpp"
+#line 2777 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
-#line 511 "engines/director/lingo/lingo-gr.y"
+#line 510 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2786 "engines/director/lingo/lingo-gr.cpp"
+#line 2785 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59:
-#line 514 "engines/director/lingo/lingo-gr.y"
+#line 513 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2795 "engines/director/lingo/lingo-gr.cpp"
+#line 2794 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60:
-#line 518 "engines/director/lingo/lingo-gr.y"
+#line 517 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2804 "engines/director/lingo/lingo-gr.cpp"
+#line 2803 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
-#line 522 "engines/director/lingo/lingo-gr.y"
+#line 521 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2813 "engines/director/lingo/lingo-gr.cpp"
+#line 2812 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
-#line 526 "engines/director/lingo/lingo-gr.y"
+#line 525 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2822,28 +2821,28 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2826 "engines/director/lingo/lingo-gr.cpp"
+#line 2825 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
-#line 534 "engines/director/lingo/lingo-gr.y"
+#line 533 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2837 "engines/director/lingo/lingo-gr.cpp"
+#line 2836 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 64:
-#line 540 "engines/director/lingo/lingo-gr.y"
+#line 539 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2843 "engines/director/lingo/lingo-gr.cpp"
+#line 2842 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 542 "engines/director/lingo/lingo-gr.y"
+#line 541 "engines/director/lingo/lingo-gr.y"
                                 {
 		// Director parser till D3 was forgiving for any hanging parentheses
 		if (g_lingo->_ignoreError) {
@@ -2854,290 +2853,290 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2858 "engines/director/lingo/lingo-gr.cpp"
+#line 2857 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 67:
-#line 553 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2864 "engines/director/lingo/lingo-gr.cpp"
+#line 2863 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
-#line 555 "engines/director/lingo/lingo-gr.y"
+#line 554 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2872 "engines/director/lingo/lingo-gr.cpp"
+#line 2871 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 558 "engines/director/lingo/lingo-gr.y"
+#line 557 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2880 "engines/director/lingo/lingo-gr.cpp"
+#line 2879 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 561 "engines/director/lingo/lingo-gr.y"
+#line 560 "engines/director/lingo/lingo-gr.y"
                                       {
 			g_lingo->code1(LC::c_lazyeval);
 			g_lingo->codeString((yyvsp[-1].s)->c_str());
 			g_lingo->codeFunc((yyvsp[-3].s), 1);
 			delete (yyvsp[-3].s);
 			delete (yyvsp[-1].s); }
-#line 2891 "engines/director/lingo/lingo-gr.cpp"
+#line 2890 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72:
-#line 567 "engines/director/lingo/lingo-gr.y"
+#line 566 "engines/director/lingo/lingo-gr.y"
                                       { g_lingo->code1(LC::c_lazyeval); g_lingo->codeString((yyvsp[-1].s)->c_str()); }
-#line 2897 "engines/director/lingo/lingo-gr.cpp"
+#line 2896 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73:
-#line 568 "engines/director/lingo/lingo-gr.y"
+#line 567 "engines/director/lingo/lingo-gr.y"
                                                     {
 			g_lingo->codeFunc((yyvsp[-6].s), (yyvsp[-1].narg) + 1);
 			delete (yyvsp[-6].s);
 			delete (yyvsp[-4].s); }
-#line 2906 "engines/director/lingo/lingo-gr.cpp"
+#line 2905 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74:
-#line 572 "engines/director/lingo/lingo-gr.y"
+#line 571 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2914 "engines/director/lingo/lingo-gr.cpp"
+#line 2913 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 575 "engines/director/lingo/lingo-gr.y"
+#line 574 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2922 "engines/director/lingo/lingo-gr.cpp"
+#line 2921 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 578 "engines/director/lingo/lingo-gr.y"
+#line 577 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2932 "engines/director/lingo/lingo-gr.cpp"
+#line 2931 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 77:
-#line 583 "engines/director/lingo/lingo-gr.y"
+#line 582 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2943 "engines/director/lingo/lingo-gr.cpp"
+#line 2942 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 590 "engines/director/lingo/lingo-gr.y"
+#line 589 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2949 "engines/director/lingo/lingo-gr.cpp"
+#line 2948 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 591 "engines/director/lingo/lingo-gr.y"
+#line 590 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2955 "engines/director/lingo/lingo-gr.cpp"
+#line 2954 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 591 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2961 "engines/director/lingo/lingo-gr.cpp"
+#line 2960 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 593 "engines/director/lingo/lingo-gr.y"
+#line 592 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2967 "engines/director/lingo/lingo-gr.cpp"
+#line 2966 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 593 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2973 "engines/director/lingo/lingo-gr.cpp"
+#line 2972 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 595 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2979 "engines/director/lingo/lingo-gr.cpp"
+#line 2978 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 596 "engines/director/lingo/lingo-gr.y"
+#line 595 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2985 "engines/director/lingo/lingo-gr.cpp"
+#line 2984 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 597 "engines/director/lingo/lingo-gr.y"
+#line 596 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2991 "engines/director/lingo/lingo-gr.cpp"
+#line 2990 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 598 "engines/director/lingo/lingo-gr.y"
+#line 597 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2997 "engines/director/lingo/lingo-gr.cpp"
+#line 2996 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 599 "engines/director/lingo/lingo-gr.y"
+#line 598 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 3003 "engines/director/lingo/lingo-gr.cpp"
+#line 3002 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 600 "engines/director/lingo/lingo-gr.y"
+#line 599 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 3009 "engines/director/lingo/lingo-gr.cpp"
+#line 3008 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 601 "engines/director/lingo/lingo-gr.y"
+#line 600 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 3015 "engines/director/lingo/lingo-gr.cpp"
+#line 3014 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 602 "engines/director/lingo/lingo-gr.y"
+#line 601 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 3021 "engines/director/lingo/lingo-gr.cpp"
+#line 3020 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 603 "engines/director/lingo/lingo-gr.y"
+#line 602 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 3027 "engines/director/lingo/lingo-gr.cpp"
+#line 3026 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 604 "engines/director/lingo/lingo-gr.y"
+#line 603 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 3033 "engines/director/lingo/lingo-gr.cpp"
+#line 3032 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 605 "engines/director/lingo/lingo-gr.y"
+#line 604 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 3039 "engines/director/lingo/lingo-gr.cpp"
+#line 3038 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 606 "engines/director/lingo/lingo-gr.y"
+#line 605 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 3045 "engines/director/lingo/lingo-gr.cpp"
+#line 3044 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 607 "engines/director/lingo/lingo-gr.y"
+#line 606 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 3051 "engines/director/lingo/lingo-gr.cpp"
+#line 3050 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 608 "engines/director/lingo/lingo-gr.y"
+#line 607 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 3057 "engines/director/lingo/lingo-gr.cpp"
+#line 3056 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 609 "engines/director/lingo/lingo-gr.y"
+#line 608 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 3063 "engines/director/lingo/lingo-gr.cpp"
+#line 3062 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 610 "engines/director/lingo/lingo-gr.y"
+#line 609 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 3069 "engines/director/lingo/lingo-gr.cpp"
+#line 3068 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 611 "engines/director/lingo/lingo-gr.y"
+#line 610 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 3075 "engines/director/lingo/lingo-gr.cpp"
+#line 3074 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 613 "engines/director/lingo/lingo-gr.y"
+#line 612 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 3081 "engines/director/lingo/lingo-gr.cpp"
+#line 3080 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 614 "engines/director/lingo/lingo-gr.y"
+#line 613 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 3087 "engines/director/lingo/lingo-gr.cpp"
+#line 3086 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 615 "engines/director/lingo/lingo-gr.y"
+#line 614 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 3093 "engines/director/lingo/lingo-gr.cpp"
+#line 3092 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 616 "engines/director/lingo/lingo-gr.y"
+#line 615 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 3099 "engines/director/lingo/lingo-gr.cpp"
+#line 3098 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 105:
-#line 617 "engines/director/lingo/lingo-gr.y"
+#line 616 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 3105 "engines/director/lingo/lingo-gr.cpp"
+#line 3104 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 106:
-#line 618 "engines/director/lingo/lingo-gr.y"
+#line 617 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 3111 "engines/director/lingo/lingo-gr.cpp"
+#line 3110 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 107:
-#line 619 "engines/director/lingo/lingo-gr.y"
+#line 618 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3117 "engines/director/lingo/lingo-gr.cpp"
+#line 3116 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 108:
-#line 620 "engines/director/lingo/lingo-gr.y"
+#line 619 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3123 "engines/director/lingo/lingo-gr.cpp"
+#line 3122 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 109:
-#line 622 "engines/director/lingo/lingo-gr.y"
+#line 621 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3131 "engines/director/lingo/lingo-gr.cpp"
+#line 3130 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 111:
-#line 627 "engines/director/lingo/lingo-gr.y"
+#line 626 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3137 "engines/director/lingo/lingo-gr.cpp"
+#line 3136 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 630 "engines/director/lingo/lingo-gr.y"
+#line 629 "engines/director/lingo/lingo-gr.y"
                                                 {
 		if (g_lingo->_repeatStack.size()) {
 			g_lingo->code2(LC::c_jump, 0);
@@ -3146,264 +3145,264 @@ yyreduce:
 		} else {
 			warning("# LINGO: exit repeat not inside repeat block");
 		} }
-#line 3150 "engines/director/lingo/lingo-gr.cpp"
+#line 3149 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 115:
-#line 638 "engines/director/lingo/lingo-gr.y"
+#line 637 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3156 "engines/director/lingo/lingo-gr.cpp"
+#line 3155 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116:
-#line 639 "engines/director/lingo/lingo-gr.y"
+#line 638 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3162 "engines/director/lingo/lingo-gr.cpp"
+#line 3161 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 639 "engines/director/lingo/lingo-gr.y"
+#line 638 "engines/director/lingo/lingo-gr.y"
                                                                                  { inLast(); }
-#line 3168 "engines/director/lingo/lingo-gr.cpp"
+#line 3167 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 640 "engines/director/lingo/lingo-gr.y"
+#line 639 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3174 "engines/director/lingo/lingo-gr.cpp"
+#line 3173 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 640 "engines/director/lingo/lingo-gr.y"
+#line 639 "engines/director/lingo/lingo-gr.y"
                                                                                    { inLast(); }
-#line 3180 "engines/director/lingo/lingo-gr.cpp"
+#line 3179 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 640 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3186 "engines/director/lingo/lingo-gr.cpp"
+#line 3185 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 640 "engines/director/lingo/lingo-gr.y"
                                                                                    { inLast(); }
-#line 3192 "engines/director/lingo/lingo-gr.cpp"
+#line 3191 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 642 "engines/director/lingo/lingo-gr.y"
+#line 641 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3200 "engines/director/lingo/lingo-gr.cpp"
+#line 3199 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 645 "engines/director/lingo/lingo-gr.y"
+#line 644 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3208 "engines/director/lingo/lingo-gr.cpp"
+#line 3207 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 648 "engines/director/lingo/lingo-gr.y"
+#line 647 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3214 "engines/director/lingo/lingo-gr.cpp"
+#line 3213 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 649 "engines/director/lingo/lingo-gr.y"
+#line 648 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3220 "engines/director/lingo/lingo-gr.cpp"
+#line 3219 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126:
-#line 651 "engines/director/lingo/lingo-gr.y"
+#line 650 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3228 "engines/director/lingo/lingo-gr.cpp"
+#line 3227 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 654 "engines/director/lingo/lingo-gr.y"
+#line 653 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3236 "engines/director/lingo/lingo-gr.cpp"
+#line 3235 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 658 "engines/director/lingo/lingo-gr.y"
+#line 657 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3246 "engines/director/lingo/lingo-gr.cpp"
+#line 3245 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 663 "engines/director/lingo/lingo-gr.y"
+#line 662 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3256 "engines/director/lingo/lingo-gr.cpp"
+#line 3255 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 669 "engines/director/lingo/lingo-gr.y"
+#line 668 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3264 "engines/director/lingo/lingo-gr.cpp"
+#line 3263 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 672 "engines/director/lingo/lingo-gr.y"
+#line 671 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3272 "engines/director/lingo/lingo-gr.cpp"
+#line 3271 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 683 "engines/director/lingo/lingo-gr.y"
+#line 682 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3278 "engines/director/lingo/lingo-gr.cpp"
+#line 3277 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 684 "engines/director/lingo/lingo-gr.y"
+#line 683 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3284 "engines/director/lingo/lingo-gr.cpp"
+#line 3283 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134:
-#line 685 "engines/director/lingo/lingo-gr.y"
+#line 684 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3290 "engines/director/lingo/lingo-gr.cpp"
+#line 3289 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135:
-#line 686 "engines/director/lingo/lingo-gr.y"
+#line 685 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3299 "engines/director/lingo/lingo-gr.cpp"
+#line 3298 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 690 "engines/director/lingo/lingo-gr.y"
+#line 689 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3308 "engines/director/lingo/lingo-gr.cpp"
+#line 3307 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 137:
-#line 694 "engines/director/lingo/lingo-gr.y"
+#line 693 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3317 "engines/director/lingo/lingo-gr.cpp"
+#line 3316 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 702 "engines/director/lingo/lingo-gr.y"
+#line 701 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3326 "engines/director/lingo/lingo-gr.cpp"
+#line 3325 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 706 "engines/director/lingo/lingo-gr.y"
+#line 705 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3335 "engines/director/lingo/lingo-gr.cpp"
+#line 3334 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 710 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3344 "engines/director/lingo/lingo-gr.cpp"
+#line 3343 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 714 "engines/director/lingo/lingo-gr.y"
+#line 713 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3350 "engines/director/lingo/lingo-gr.cpp"
+#line 3349 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 714 "engines/director/lingo/lingo-gr.y"
+#line 713 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3359 "engines/director/lingo/lingo-gr.cpp"
+#line 3358 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 744 "engines/director/lingo/lingo-gr.y"
+#line 743 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3365 "engines/director/lingo/lingo-gr.cpp"
+#line 3364 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 744 "engines/director/lingo/lingo-gr.y"
+#line 743 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->_currentFactory = NULL; }
-#line 3371 "engines/director/lingo/lingo-gr.cpp"
+#line 3370 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 745 "engines/director/lingo/lingo-gr.y"
+#line 744 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3381 "engines/director/lingo/lingo-gr.cpp"
+#line 3380 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 750 "engines/director/lingo/lingo-gr.y"
+#line 749 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3387 "engines/director/lingo/lingo-gr.cpp"
+#line 3386 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 751 "engines/director/lingo/lingo-gr.y"
+#line 750 "engines/director/lingo/lingo-gr.y"
                   { startDef(); }
-#line 3393 "engines/director/lingo/lingo-gr.cpp"
+#line 3392 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 752 "engines/director/lingo/lingo-gr.y"
+#line 751 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg), g_lingo->_currentFactory);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3403 "engines/director/lingo/lingo-gr.cpp"
+#line 3402 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 757 "engines/director/lingo/lingo-gr.y"
+#line 756 "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));
@@ -3412,70 +3411,70 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3416 "engines/director/lingo/lingo-gr.cpp"
+#line 3415 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152:
-#line 765 "engines/director/lingo/lingo-gr.y"
+#line 764 "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 3426 "engines/director/lingo/lingo-gr.cpp"
+#line 3425 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 771 "engines/director/lingo/lingo-gr.y"
+#line 770 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3432 "engines/director/lingo/lingo-gr.cpp"
+#line 3431 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 154:
-#line 771 "engines/director/lingo/lingo-gr.y"
+#line 770 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; }
-#line 3439 "engines/director/lingo/lingo-gr.cpp"
+#line 3438 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 774 "engines/director/lingo/lingo-gr.y"
+#line 773 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3445 "engines/director/lingo/lingo-gr.cpp"
+#line 3444 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 775 "engines/director/lingo/lingo-gr.y"
+#line 774 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3451 "engines/director/lingo/lingo-gr.cpp"
+#line 3450 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 157:
-#line 776 "engines/director/lingo/lingo-gr.y"
+#line 775 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3457 "engines/director/lingo/lingo-gr.cpp"
+#line 3456 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 779 "engines/director/lingo/lingo-gr.y"
+#line 778 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3463 "engines/director/lingo/lingo-gr.cpp"
+#line 3462 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 780 "engines/director/lingo/lingo-gr.y"
+#line 779 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3469 "engines/director/lingo/lingo-gr.cpp"
+#line 3468 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 782 "engines/director/lingo/lingo-gr.y"
+#line 781 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3475 "engines/director/lingo/lingo-gr.cpp"
+#line 3474 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 784 "engines/director/lingo/lingo-gr.y"
+#line 783 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3483,113 +3482,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3487 "engines/director/lingo/lingo-gr.cpp"
+#line 3486 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 792 "engines/director/lingo/lingo-gr.y"
+#line 791 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3493 "engines/director/lingo/lingo-gr.cpp"
+#line 3492 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 793 "engines/director/lingo/lingo-gr.y"
+#line 792 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3499 "engines/director/lingo/lingo-gr.cpp"
+#line 3498 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 794 "engines/director/lingo/lingo-gr.y"
+#line 793 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3505 "engines/director/lingo/lingo-gr.cpp"
+#line 3504 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 796 "engines/director/lingo/lingo-gr.y"
+#line 795 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3511 "engines/director/lingo/lingo-gr.cpp"
+#line 3510 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 797 "engines/director/lingo/lingo-gr.y"
+#line 796 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3517 "engines/director/lingo/lingo-gr.cpp"
+#line 3516 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 799 "engines/director/lingo/lingo-gr.y"
+#line 798 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3523 "engines/director/lingo/lingo-gr.cpp"
+#line 3522 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 801 "engines/director/lingo/lingo-gr.y"
+#line 800 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3529 "engines/director/lingo/lingo-gr.cpp"
+#line 3528 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 802 "engines/director/lingo/lingo-gr.y"
+#line 801 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3535 "engines/director/lingo/lingo-gr.cpp"
+#line 3534 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 803 "engines/director/lingo/lingo-gr.y"
+#line 802 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3541 "engines/director/lingo/lingo-gr.cpp"
+#line 3540 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 804 "engines/director/lingo/lingo-gr.y"
+#line 803 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3547 "engines/director/lingo/lingo-gr.cpp"
+#line 3546 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173:
-#line 806 "engines/director/lingo/lingo-gr.y"
+#line 805 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3553 "engines/director/lingo/lingo-gr.cpp"
+#line 3552 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174:
-#line 807 "engines/director/lingo/lingo-gr.y"
+#line 806 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3559 "engines/director/lingo/lingo-gr.cpp"
+#line 3558 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 175:
-#line 809 "engines/director/lingo/lingo-gr.y"
+#line 808 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3565 "engines/director/lingo/lingo-gr.cpp"
+#line 3564 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 176:
-#line 810 "engines/director/lingo/lingo-gr.y"
+#line 809 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3571 "engines/director/lingo/lingo-gr.cpp"
+#line 3570 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 177:
-#line 812 "engines/director/lingo/lingo-gr.y"
+#line 811 "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 3580 "engines/director/lingo/lingo-gr.cpp"
+#line 3579 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 178:
-#line 816 "engines/director/lingo/lingo-gr.y"
+#line 815 "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 3589 "engines/director/lingo/lingo-gr.cpp"
+#line 3588 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3593 "engines/director/lingo/lingo-gr.cpp"
+#line 3592 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3788,7 +3787,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 822 "engines/director/lingo/lingo-gr.y"
+#line 821 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index ad63b2e42e..7deb462e1d 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.6.2.  */
+/* A Bison parser, made by GNU Bison 3.6.3.  */
 
 /* Bison interface for Yacc-like parsers in C
 
@@ -147,7 +147,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 162 "engines/director/lingo/lingo-gr.y"
+#line 161 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 41a41a2e07..e88581adcb 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -95,7 +95,7 @@ static void startDef() {
 	g_lingo->_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
 
 	if (g_lingo->_inFactory) {
-		for (SymbolHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
+		for (DatumHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
 			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
 		}
 	}
@@ -146,8 +146,7 @@ static void mVar(Common::String *s, VarType type) {
 		(*g_lingo->_methodVars)[*s] = type;
 		if (type == kVarInstance) {
 			if (g_lingo->_inFactory) {
-				g_lingo->_currentFactory->properties[*s] = Symbol();
-				g_lingo->_currentFactory->properties[*s].name = new Common::String(*s);
+				g_lingo->_currentFactory->properties[*s] = Datum();
 			} else {
 				warning("Instance var '%s' defined outside factory", s->c_str());
 			}
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 0df83c3253..ed14229710 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -162,7 +162,7 @@ bool Object::hasVar(const Common::String &varName) {
 	return properties.contains(varName);
 }
 
-Symbol &Object::getVar(const Common::String &varName) {
+Datum &Object::getVar(const Common::String &varName) {
 	return properties[varName];
 }
 
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 682a1297a7..16ac840feb 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1073,7 +1073,7 @@ void Lingo::executePerFrameHook(int frame, int subframe) {
 void Lingo::printAllVars() {
 	debugN("  Local vars: ");
 	if (_localvars) {
-		for (SymbolHash::iterator i = _localvars->begin(); i != _localvars->end(); ++i) {
+		for (DatumHash::iterator i = _localvars->begin(); i != _localvars->end(); ++i) {
 			debugN("%s, ", (*i)._key.c_str());
 		}
 	} else {
@@ -1083,14 +1083,14 @@ void Lingo::printAllVars() {
 
 	if (_currentMe.type == OBJECT) {
 		debugN("  Instance/property vars: ");
-		for (SymbolHash::iterator i = _currentMe.u.obj->properties.begin(); i != _currentMe.u.obj->properties.end(); ++i) {
+		for (DatumHash::iterator i = _currentMe.u.obj->properties.begin(); i != _currentMe.u.obj->properties.end(); ++i) {
 			debugN("%s, ", (*i)._key.c_str());
 		}
 		debugN("\n");
 	}
 
 	debugN("  Global vars: ");
-	for (SymbolHash::iterator i = _globalvars.begin(); i != _globalvars.end(); ++i) {
+	for (DatumHash::iterator i = _globalvars.begin(); i != _globalvars.end(); ++i) {
 		debugN("%s, ", (*i)._key.c_str());
 	}
 	debugN("\n");
@@ -1125,7 +1125,7 @@ int Lingo::castIdFetch(Datum &var) {
 	return id;
 }
 
-void Lingo::varAssign(Datum &var, Datum &value, bool global, SymbolHash *localvars) {
+void Lingo::varAssign(Datum &var, Datum &value, bool global, DatumHash *localvars) {
 	if (localvars == nullptr) {
 		localvars = _localvars;
 	}
@@ -1136,59 +1136,29 @@ void Lingo::varAssign(Datum &var, Datum &value, bool global, SymbolHash *localva
 	}
 
 	if (var.type == VAR) {
-		Symbol *sym = nullptr;
+		Datum *d = nullptr;
 		Common::String name = *var.u.s;
 
 		if (localvars && localvars->contains(name)) {
-			sym = &(*localvars)[name];
+			d = &(*localvars)[name];
 			if (global)
 				warning("varAssign: variable %s is local, not global", name.c_str());
 		} else if (_currentMe.type == OBJECT && _currentMe.u.obj->hasVar(name)) {
-			sym = &_currentMe.u.obj->getVar(name);
+			d = &_currentMe.u.obj->getVar(name);
 			if (global)
-				warning("varAssign: variable %s is instance or property, not global", sym->name->c_str());
+				warning("varAssign: variable %s is instance or property, not global", name.c_str());
 		} else if (_globalvars.contains(name)) {
-			sym = &_globalvars[name];
+			d = &_globalvars[name];
 			if (!global)
 				warning("varAssign: variable %s is global, not local", name.c_str());
 		}
 
-		if (!sym) {
+		if (!d) {
 			warning("varAssign: variable %s not defined", name.c_str());
 			return;
 		}
 
-		if (sym->type != INT && sym->type != VOID &&
-				sym->type != FLOAT && sym->type != STRING &&
-				sym->type != ARRAY && sym->type != PARRAY && sym->type != OBJECT &&
-				sym->type != POINT) {
-			warning("varAssign: assignment to non-variable '%s'", sym->name->c_str());
-			return;
-		}
-
-		sym->reset();
-		sym->refCount = value.refCount;
-		*sym->refCount += 1;
-		sym->name = new Common::String(name);
-		sym->type = value.type;
-		if (value.type == INT) {
-			sym->u.i = value.u.i;
-		} else if (value.type == FLOAT) {
-			sym->u.f = value.u.f;
-		} else if (value.type == STRING || value.type == SYMBOL) {
-			sym->u.s = value.u.s;
-		} else if (value.type == POINT || value.type == ARRAY) {
-			sym->u.farr = value.u.farr;
-		} else if (value.type == PARRAY) {
-			sym->u.parr = value.u.parr;
-		} else if (value.type == OBJECT) {
-			sym->u.obj = value.u.obj;
-		} else if (value.type == VOID) {
-			sym->u.i = 0;
-		} else {
-			warning("varAssign: unhandled type: %s", value.type2str());
-			sym->u.s = value.u.s;
-		}
+		*d = value;
 	} else if (var.type == REFERENCE) {
 		Score *score = g_director->getCurrentScore();
 		if (!score) {
@@ -1212,7 +1182,7 @@ void Lingo::varAssign(Datum &var, Datum &value, bool global, SymbolHash *localva
 	}
 }
 
-Datum Lingo::varFetch(Datum &var, bool global, SymbolHash *localvars) {
+Datum Lingo::varFetch(Datum &var, bool global, DatumHash *localvars) {
 	if (localvars == nullptr) {
 		localvars = _localvars;
 	}
@@ -1225,7 +1195,7 @@ Datum Lingo::varFetch(Datum &var, bool global, SymbolHash *localvars) {
 	}
 
 	if (var.type == VAR) {
-		Symbol *sym = nullptr;
+		Datum *d = nullptr;
 		Common::String name = *var.u.s;
 
 		if (_currentMe.type == OBJECT && name.equalsIgnoreCase("me")) {
@@ -1233,48 +1203,25 @@ Datum Lingo::varFetch(Datum &var, bool global, SymbolHash *localvars) {
 			return result;
 		}
 		if (localvars && localvars->contains(name)) {
-			sym = &(*localvars)[name];
+			d = &(*localvars)[name];
 			if (global)
-				warning("varFetch: variable %s is local, not global", sym->name->c_str());
+				warning("varFetch: variable %s is local, not global", name.c_str());
 		} else if (_currentMe.type == OBJECT && _currentMe.u.obj->hasVar(name)) {
-			sym = &_currentMe.u.obj->getVar(name);
+			d = &_currentMe.u.obj->getVar(name);
 			if (global)
-				warning("varFetch: variable %s is instance or property, not global", sym->name->c_str());
+				warning("varFetch: variable %s is instance or property, not global", name.c_str());
 		} else if (_globalvars.contains(name)) {
-			sym = &_globalvars[name];
+			d = &_globalvars[name];
 			if (!global)
-				warning("varFetch: variable %s is global, not local", sym->name->c_str());
+				warning("varFetch: variable %s is global, not local", name.c_str());
 		}
 
-		if (!sym) {
+		if (!d) {
 			warning("varFetch: variable %s not found", name.c_str());
 			return result;
 		}
 
-		result.type = sym->type;
-		delete result.refCount;
-		result.refCount = sym->refCount;
-		*result.refCount += 1;
-
-		if (sym->type == INT)
-			result.u.i = sym->u.i;
-		else if (sym->type == FLOAT)
-			result.u.f = sym->u.f;
-		else if (sym->type == STRING || sym->type == SYMBOL)
-			result.u.s = sym->u.s;
-		else if (sym->type == POINT || sym->type == ARRAY)
-			result.u.farr = sym->u.farr;
-		else if (sym->type == PARRAY)
-			result.u.parr = sym->u.parr;
-		else if (sym->type == OBJECT)
-			result.u.obj = sym->u.obj;
-		else if (sym->type == VOID)
-			result.u.i = 0;
-		else {
-			warning("varFetch: unhandled type: %s", var.type2str());
-			result.type = VOID;
-		}
-
+		return *d;
 	} else if (var.type == REFERENCE) {
 		Cast *cast = _vm->getCastMember(var.u.i);
 		if (cast) {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 489d1268b1..d731af123f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -218,6 +218,7 @@ struct ScriptContext {
 typedef Common::HashMap<int32, ScriptContext *> ScriptContextHash;
 typedef Common::Array<Datum> StackData;
 typedef Common::HashMap<Common::String, Symbol, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> SymbolHash;
+typedef Common::HashMap<Common::String, Datum, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> DatumHash;
 typedef Common::HashMap<Common::String, Builtin *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> BuiltinHash;
 
 typedef Common::HashMap<Common::String, TheEntity *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityHash;
@@ -237,7 +238,7 @@ struct Object {
 	bool disposed;
 
 	Object *prototype;
-	SymbolHash properties;
+	DatumHash properties;
 	SymbolHash methods;
 	int inheritanceLevel; // 1 for original object
 	ScriptContext *scriptContext;
@@ -268,7 +269,7 @@ struct Object {
 	virtual Object *clone();
 	Symbol getMethod(const Common::String &methodName);
 	bool hasVar(const Common::String &varName);
-	Symbol &getVar(const Common::String &varName);
+	Datum &getVar(const Common::String &varName);
 };
 
 struct CFrame {	/* proc/func call stack frame */
@@ -277,7 +278,7 @@ struct CFrame {	/* proc/func call stack frame */
 	ScriptData	*retscript;	 /* which script to resume after return */
 	ScriptContext	*retctx;   /* which script context to use after return */
 	int 	retarchive;	/* which archive to use after return */
-	SymbolHash *localvars;
+	DatumHash *localvars;
 	Datum retMe; /* which me obj to use after return */
 };
 
@@ -378,8 +379,8 @@ public:
 	void popContext();
 	void cleanLocalVars();
 	int castIdFetch(Datum &var);
-	void varAssign(Datum &var, Datum &value, bool global = false, SymbolHash *localvars = nullptr);
-	Datum varFetch(Datum &var, bool global = false, SymbolHash *localvars = nullptr);
+	void varAssign(Datum &var, Datum &value, bool global = false, DatumHash *localvars = nullptr);
+	Datum varFetch(Datum &var, bool global = false, DatumHash *localvars = nullptr);
 
 	int getAlignedType(Datum &d1, Datum &d2);
 
@@ -468,7 +469,7 @@ public:
 	int codeString(const char *s);
 	Symbol define(Common::String &s, int nargs, ScriptData *code, Common::Array<Common::String> *argNames = nullptr, Common::Array<Common::String> *varNames = nullptr, Object *obj = nullptr);
 	void processIf(int toplabel, int endlabel);
-	void varCreate(const Common::String &name, bool global, SymbolHash *localvars = nullptr);
+	void varCreate(const Common::String &name, bool global, DatumHash *localvars = nullptr);
 
 	int _assemblyArchive;
 	ScriptContext *_assemblyContext;
@@ -538,8 +539,8 @@ public:
 	Common::HashMap<Common::String, uint32, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _eventHandlerTypeIds;
 	Common::HashMap<Common::String, Audio::AudioStream *> _audioAliases;
 
-	SymbolHash _globalvars;
-	SymbolHash *_localvars;
+	DatumHash _globalvars;
+	DatumHash *_localvars;
 
 	FuncHash _functions;
 
diff --git a/engines/director/lingo/xlibs/fileio.cpp b/engines/director/lingo/xlibs/fileio.cpp
index 50cfcf46dc..6384b59794 100644
--- a/engines/director/lingo/xlibs/fileio.cpp
+++ b/engines/director/lingo/xlibs/fileio.cpp
@@ -62,9 +62,7 @@ void FileIO::initialize(int type) {
 		if (!g_lingo->_globalvars.contains(xlibName)) {
 			FileObject *xobj = new FileObject(kXObj);
 			xobj->initMethods();
-			g_lingo->_globalvars[xlibName] = Symbol();
-			g_lingo->_globalvars[xlibName].name = new Common::String(xlibName);
-			g_lingo->_globalvars[xlibName].global = true;
+			g_lingo->_globalvars[xlibName] = Datum();
 			g_lingo->_globalvars[xlibName].type = OBJECT;
 			g_lingo->_globalvars[xlibName].u.obj = xobj;
 		} else {


Commit: 75dd6b5103999fe54712d552b374de6df7defd26
    https://github.com/scummvm/scummvm/commit/75dd6b5103999fe54712d552b374de6df7defd26
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-15T09:45:48-04:00

Commit Message:
DIRECTOR: LINGO: Remove variable types from Symbol

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


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 16ac840feb..1f0dd82ad2 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -49,7 +49,6 @@ Symbol::Symbol() {
 	maxArgs = 0;
 	parens = true;
 	targetType = kNoneObj;
-	global = false;
 	argNames = nullptr;
 	varNames = nullptr;
 	ctx = nullptr;
@@ -59,14 +58,13 @@ Symbol::Symbol() {
 Symbol::Symbol(const Symbol &s) {
 	name = s.name;
 	type = s.type;
-	u.s = s.u.s;
+	u = s.u;
 	refCount = s.refCount;
 	*refCount += 1;
 	nargs = s.nargs;
 	maxArgs = s.maxArgs;
 	parens = s.parens;
 	targetType = s.targetType;
-	global = s.global;
 	argNames = s.argNames;
 	varNames = s.varNames;
 	ctx = s.ctx;
@@ -78,14 +76,13 @@ Symbol& Symbol::operator=(const Symbol &s) {
 		reset();
 		name = s.name;
 		type = s.type;
-		u.s = s.u.s;
+		u = s.u;
 		refCount = s.refCount;
 		*refCount += 1;
 		nargs = s.nargs;
 		maxArgs = s.maxArgs;
 		parens = s.parens;
 		targetType = s.targetType;
-		global = s.global;
 		argNames = s.argNames;
 		varNames = s.varNames;
 		ctx = s.ctx;
@@ -99,37 +96,12 @@ void Symbol::reset() {
 	if (*refCount <= 0) {
 		if (name)
 			delete name;
-		switch (type) {
-		case HANDLER:
+
+		if (type == HANDLER)
 			delete u.defn;
-			break;
-		case STRING:
+		else if (type == STRING)
 			delete u.s;
-			break;
-		case ARRAY:
-			// fallthrough
-		case POINT:
-			// fallthrough
-		case RECT:
-			delete u.farr;
-			break;
-		case PARRAY:
-			delete u.parr;
-			break;
-		case OBJECT:
-			delete u.obj;
-			break;
-		case VAR:
-			// fallthrough
-		case REFERENCE:
-			// fallthrough
-		case INT:
-			// fallthrough
-		case FLOAT:
-			// fallthrough
-		default:
-			break;
-		}
+
 		if (argNames)
 			delete argNames;
 		if (varNames)
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index d731af123f..0cc68c991a 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -80,15 +80,10 @@ struct Symbol {	/* symbol table entry */
 	Common::String *name;
 	int type;
 	union {
-		int		i;			/* VAR */
-		double	f;			/* FLOAT */
 		ScriptData	*defn;	/* HANDLER */
 		void (*func)();		/* OPCODE */
 		void (*bltin)(int);	/* BUILTIN */
 		Common::String	*s;	/* STRING */
-		DatumArray *farr;	/* ARRAY, POINT, RECT */
-		PropertyArray *parr;
-		Object *obj;
 	} u;
 
 	int *refCount;
@@ -98,7 +93,6 @@ struct Symbol {	/* symbol table entry */
 	bool parens;	/* whether parens required or not, for builitins */
 	int targetType;	/* valid target objects, for method builtins */
 
-	bool global;
 	Common::Array<Common::String> *argNames;
 	Common::Array<Common::String> *varNames;
 	ScriptContext *ctx;		/* optional script context to execute with */




More information about the Scummvm-git-logs mailing list