[Scummvm-git-logs] scummvm master -> a441f4a047b8af8c48a29677c95d6d2268f81982

sev- sev at scummvm.org
Wed Feb 22 18:23:14 CET 2017


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

Summary:
7db8908bc1 DIRECTOR: Lingo: Hid another trace under lingoparse debug flag
9dfb8ffd12 DIRECTOR: Lingo: Turned if() statement code into relative jumps
d73ebf5c55 DIRECTOR: Lingo: Fixed float constants processing
0b64be9773 DIRECTOR: Lingo: Move repeat..with, repeat..while and when to relative addresses
58d393b314 DIRECTOR: Lingo: Fix when..then execution
bb4b96bcab DIRECTOR: Lingo: Avoid pushing fake values on stack
b36d517406 DIRECTOR: Lingo: Fixed stack underflow in handler execution
4cdb198f78 DIRECTOR: Lingo: Fix stack overflow when assigning 'the' entity
c03ee226ae DIRECTOR: Added sanity check when drawing text
b9ce9f028d DIRECTOR: Lingo: Added type2str for REFERENCE type
59f2d1359c DIRECTOR: Simplified version checks and added more debug output
d2fe6628f2 DIRECTOR: Added more debug output
9cdeb4c88e DIRECTOR: Lingo: Implemented b_field() method
a441f4a047 DIRECTOR: Lingo: Initial code for field assignments


Commit: 7db8908bc129fefa4b7d80792ec70d082b535824
    https://github.com/scummvm/scummvm/commit/7db8908bc129fefa4b7d80792ec70d082b535824
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T11:36:16+01:00

Commit Message:
DIRECTOR: Lingo: Hid another trace under lingoparse debug flag

Changed paths:
    engines/director/lingo/lingo-lex.cpp
    engines/director/lingo/lingo-lex.l


diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp
index 48a5166..c931dc8 100644
--- a/engines/director/lingo/lingo-lex.cpp
+++ b/engines/director/lingo/lingo-lex.cpp
@@ -746,7 +746,7 @@ using namespace Director;
 
 int yyparse();
 static void count() {
-	if (debugChannelSet(-1, kDebugLingoCompile))
+	if (debugChannelSet(-1, kDebugLingoParse))
 		debug("LEXER: Read '%s' at %d:%d", yytext, g_lingo->_linenumber, g_lingo->_colnumber);
 
 	g_lingo->_colnumber += strlen(yytext);
diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l
index 37bad12..6a38bac 100644
--- a/engines/director/lingo/lingo-lex.l
+++ b/engines/director/lingo/lingo-lex.l
@@ -37,7 +37,7 @@ using namespace Director;
 
 int yyparse();
 static void count() {
-	if (debugChannelSet(-1, kDebugLingoCompile))
+	if (debugChannelSet(-1, kDebugLingoParse))
 		debug("LEXER: Read '%s' at %d:%d", yytext, g_lingo->_linenumber, g_lingo->_colnumber);
 
 	g_lingo->_colnumber += strlen(yytext);


Commit: 9dfb8ffd12742dcd29fdff15b6d9bc73ed333f85
    https://github.com/scummvm/scummvm/commit/9dfb8ffd12742dcd29fdff15b6d9bc73ed333f85
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T12:05:19+01:00

Commit Message:
DIRECTOR: Lingo: Turned if() statement code into relative jumps

This will let us relocate code as we want, particularly when a
macro/handler is defined

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index eeae053..8965074 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -916,14 +916,14 @@ void Lingo::c_ifcode() {
 
 	if (d.toInt()) {
 		debugC(8, kDebugLingoExec, "executing then");
-		g_lingo->execute(then);
+		g_lingo->execute(then + savepc - 1);
 	} else if (elsep) { /* else part? */
 		debugC(8, kDebugLingoExec, "executing else");
-		g_lingo->execute(elsep);
+		g_lingo->execute(elsep + savepc - 1);
 	}
 
 	if (!g_lingo->_returning && !skipEnd) {
-		g_lingo->_pc = end; /* next stmt */
+		g_lingo->_pc = end + savepc - 1; /* next stmt */
 		debugC(8, kDebugLingoExec, "executing end");
 	} else {
 		debugC(8, kDebugLingoExec, "Skipped end");
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 0d771ec..8fa787b 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -380,6 +380,9 @@ void Lingo::processIf(int elselabel, int endlabel) {
 		if (!label)
 			break;
 
+		if (else1)
+			else1 = else1 - label;
+
 		WRITE_UINT32(&ielse1, else1);
 		(*_currentScript)[label + 2] = ielse1;    /* elsepart */
 		(*_currentScript)[label + 3] = iend;      /* end, if cond fails */
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 8d1e848..d63a136 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -2342,8 +2342,8 @@ yyreduce:
 #line 260 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0, end = 0;
-		WRITE_UINT32(&then, (yyvsp[(5) - (7)].code));
-		WRITE_UINT32(&end, (yyvsp[(6) - (7)].code));
+		WRITE_UINT32(&then, (yyvsp[(5) - (7)].code) - (yyvsp[(1) - (7)].code));
+		WRITE_UINT32(&end, (yyvsp[(6) - (7)].code) - (yyvsp[(1) - (7)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (7)].code) + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (7)].code) + 3] = end;	/* end, if cond fails */
 
@@ -2356,9 +2356,9 @@ yyreduce:
 #line 270 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, (yyvsp[(5) - (10)].code));
-		WRITE_UINT32(&else1, (yyvsp[(8) - (10)].code));
-		WRITE_UINT32(&end, (yyvsp[(9) - (10)].code));
+		WRITE_UINT32(&then, (yyvsp[(5) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&else1, (yyvsp[(8) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&end, (yyvsp[(9) - (10)].code) - (yyvsp[(1) - (10)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 3] = end;	/* end, if cond fails */
@@ -2372,25 +2372,25 @@ yyreduce:
 #line 282 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, (yyvsp[(5) - (10)].code));
-		WRITE_UINT32(&else1, (yyvsp[(7) - (10)].code));
-		WRITE_UINT32(&end, (yyvsp[(9) - (10)].code));
+		WRITE_UINT32(&then, (yyvsp[(5) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&else1, (yyvsp[(7) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&end, (yyvsp[(9) - (10)].code) - (yyvsp[(1) - (10)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 3] = end;	/* end, if cond fails */
 
 		checkEnd((yyvsp[(10) - (10)].s), "if", true);
 
-		g_lingo->processIf(0, (yyvsp[(9) - (10)].code)); ;}
+		g_lingo->processIf(0, (yyvsp[(9) - (10)].code) - (yyvsp[(1) - (10)].code)); ;}
     break;
 
   case 33:
 #line 294 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, (yyvsp[(4) - (6)].code));
+		WRITE_UINT32(&then, (yyvsp[(4) - (6)].code) - (yyvsp[(1) - (6)].code));
 		WRITE_UINT32(&else1, 0);
-		WRITE_UINT32(&end, (yyvsp[(6) - (6)].code));
+		WRITE_UINT32(&end, (yyvsp[(6) - (6)].code) - (yyvsp[(1) - (6)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (6)].code) + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (6)].code) + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (6)].code) + 3] = end; 	/* end, if cond fails */
@@ -2402,9 +2402,9 @@ yyreduce:
 #line 304 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, (yyvsp[(4) - (10)].code));
-		WRITE_UINT32(&else1, (yyvsp[(8) - (10)].code));
-		WRITE_UINT32(&end, (yyvsp[(10) - (10)].code));
+		WRITE_UINT32(&then, (yyvsp[(4) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&else1, (yyvsp[(8) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&end, (yyvsp[(10) - (10)].code) - (yyvsp[(1) - (10)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 3] = end; 	/* end, if cond fails */
@@ -2416,14 +2416,14 @@ yyreduce:
 #line 314 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, (yyvsp[(4) - (10)].code));
-		WRITE_UINT32(&else1, (yyvsp[(6) - (10)].code));
-		WRITE_UINT32(&end, (yyvsp[(10) - (10)].code));
+		WRITE_UINT32(&then, (yyvsp[(4) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&else1, (yyvsp[(6) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&end, (yyvsp[(10) - (10)].code) - (yyvsp[(1) - (10)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 3] = end; 	/* end, if cond fails */
 
-		g_lingo->processIf(0, (yyvsp[(10) - (10)].code)); ;}
+		g_lingo->processIf(0, (yyvsp[(10) - (10)].code) - (yyvsp[(1) - (10)].code)); ;}
     break;
 
   case 36:
@@ -2440,7 +2440,7 @@ yyreduce:
 #line 338 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0;
-		WRITE_UINT32(&then, (yyvsp[(4) - (6)].code));
+		WRITE_UINT32(&then, (yyvsp[(4) - (6)].code) - (yyvsp[(1) - (6)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (6)].code) + 1] = then;	/* thenpart */
 
 		g_lingo->codeLabel((yyvsp[(1) - (6)].code)); ;}
@@ -2450,7 +2450,7 @@ yyreduce:
 #line 347 "engines/director/lingo/lingo-gr.y"
     {
 		inst then = 0;
-		WRITE_UINT32(&then, (yyvsp[(5) - (6)].code));
+		WRITE_UINT32(&then, (yyvsp[(5) - (6)].code) - (yyvsp[(1) - (6)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (6)].code) + 1] = then;	/* thenpart */
 
 		g_lingo->codeLabel((yyvsp[(1) - (6)].code)); ;}
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 86f8743..4fb2f4c 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -259,8 +259,8 @@ stmt: stmtoneliner
 
 ifstmt:	if cond tTHEN nl stmtlist end ENDCLAUSE		{
 		inst then = 0, end = 0;
-		WRITE_UINT32(&then, $5);
-		WRITE_UINT32(&end, $6);
+		WRITE_UINT32(&then, $5 - $1);
+		WRITE_UINT32(&end, $6 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[$1 + 3] = end;	/* end, if cond fails */
 
@@ -269,9 +269,9 @@ ifstmt:	if cond tTHEN nl stmtlist end ENDCLAUSE		{
 		g_lingo->processIf(0, 0); }
 	| if cond tTHEN nl stmtlist end tNLELSE stmtlist end ENDCLAUSE {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, $5);
-		WRITE_UINT32(&else1, $8);
-		WRITE_UINT32(&end, $9);
+		WRITE_UINT32(&then, $5 - $1);
+		WRITE_UINT32(&else1, $8 - $1);
+		WRITE_UINT32(&end, $9 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[$1 + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[$1 + 3] = end;	/* end, if cond fails */
@@ -281,21 +281,21 @@ ifstmt:	if cond tTHEN nl stmtlist end ENDCLAUSE		{
 		g_lingo->processIf(0, 0); }
 	| if cond tTHEN nl stmtlist end begin elseifstmt end ENDCLAUSE {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, $5);
-		WRITE_UINT32(&else1, $7);
-		WRITE_UINT32(&end, $9);
+		WRITE_UINT32(&then, $5 - $1);
+		WRITE_UINT32(&else1, $7 - $1);
+		WRITE_UINT32(&end, $9 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[$1 + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[$1 + 3] = end;	/* end, if cond fails */
 
 		checkEnd($10, "if", true);
 
-		g_lingo->processIf(0, $9); }
+		g_lingo->processIf(0, $9 - $1); }
 	| if cond tTHEN begin stmtoneliner end {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, $4);
+		WRITE_UINT32(&then, $4 - $1);
 		WRITE_UINT32(&else1, 0);
-		WRITE_UINT32(&end, $6);
+		WRITE_UINT32(&end, $6 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[$1 + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[$1 + 3] = end; 	/* end, if cond fails */
@@ -303,9 +303,9 @@ ifstmt:	if cond tTHEN nl stmtlist end ENDCLAUSE		{
 		g_lingo->processIf(0, 0); }
 	| if cond tTHEN begin stmtoneliner end tNLELSE begin stmtoneliner end {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, $4);
-		WRITE_UINT32(&else1, $8);
-		WRITE_UINT32(&end, $10);
+		WRITE_UINT32(&then, $4 - $1);
+		WRITE_UINT32(&else1, $8 - $1);
+		WRITE_UINT32(&end, $10 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[$1 + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[$1 + 3] = end; 	/* end, if cond fails */
@@ -313,14 +313,14 @@ ifstmt:	if cond tTHEN nl stmtlist end ENDCLAUSE		{
 		g_lingo->processIf(0, 0); }
 	| if cond tTHEN begin stmtoneliner end elseifstmtoneliner end elsestmtoneliner end {
 		inst then = 0, else1 = 0, end = 0;
-		WRITE_UINT32(&then, $4);
-		WRITE_UINT32(&else1, $6);
-		WRITE_UINT32(&end, $10);
+		WRITE_UINT32(&then, $4 - $1);
+		WRITE_UINT32(&else1, $6 - $1);
+		WRITE_UINT32(&end, $10 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 		(*g_lingo->_currentScript)[$1 + 2] = else1;	/* elsepart */
 		(*g_lingo->_currentScript)[$1 + 3] = end; 	/* end, if cond fails */
 
-		g_lingo->processIf(0, $10); }
+		g_lingo->processIf(0, $10 - $1); }
 	;
 
 elsestmtoneliner: /* nothing */		{ $$ = 0; }
@@ -337,7 +337,7 @@ elseifstmtoneliner: elseifstmtoneliner elseifstmtoneliner1
 
 elseifstmtoneliner1:	elseif cond tTHEN begin stmt end {
 		inst then = 0;
-		WRITE_UINT32(&then, $4);
+		WRITE_UINT32(&then, $4 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 
 		g_lingo->codeLabel($1); }
@@ -346,7 +346,7 @@ elseifstmtoneliner1:	elseif cond tTHEN begin stmt end {
 elseifstmt1: elseifstmtoneliner
 	| elseif cond tTHEN begin stmtlist end {
 		inst then = 0;
-		WRITE_UINT32(&then, $5);
+		WRITE_UINT32(&then, $5 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = then;	/* thenpart */
 
 		g_lingo->codeLabel($1); }


Commit: d73ebf5c5542f079445b10a8677e241ec47ecd1b
    https://github.com/scummvm/scummvm/commit/d73ebf5c5542f079445b10a8677e241ec47ecd1b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T12:22:00+01:00

Commit Message:
DIRECTOR: Lingo: Fixed float constants processing

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 8965074..fbee0d8 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -212,7 +212,7 @@ void Lingo::c_voidpush() {
 void Lingo::c_fconstpush() {
 	Datum d;
 	inst i = (*g_lingo->_currentScript)[g_lingo->_pc];
-	d.u.i = READ_UINT32(&i);	// d.u.f value will be read
+	d.u.f = *(double *)(&i);
 	d.type = FLOAT;
 
 	g_lingo->_pc += g_lingo->calcCodeAlignment(sizeof(double));
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 8fa787b..8347d93 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -103,7 +103,7 @@ Common::String Lingo::decodeInstruction(uint pc, uint *newPc) {
 				{
 					Datum d;
 					i = (*_currentScript)[pc++];
-					d.u.i = READ_UINT32(&i);
+					d.u.f = *(double *)(&i);
 
 					res += Common::String::format(" %f", d.u.f);
 					break;


Commit: 0b64be9773a09ba9349a44dc9eaa87260a6eaa0d
    https://github.com/scummvm/scummvm/commit/0b64be9773a09ba9349a44dc9eaa87260a6eaa0d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T12:31:56+01:00

Commit Message:
DIRECTOR: Lingo: Move repeat..with, repeat..while and when to relative addresses

This makes whole Lingo compiled code relocatable

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index fbee0d8..3dead58 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -833,7 +833,7 @@ void Lingo::c_repeatwhilecode(void) {
 	d.toInt();
 
 	while (d.u.i) {
-		g_lingo->execute(body);	/* body */
+		g_lingo->execute(body + savepc - 1);	/* body */
 		if (g_lingo->_returning)
 			break;
 
@@ -848,7 +848,7 @@ void Lingo::c_repeatwhilecode(void) {
 	}
 
 	if (!g_lingo->_returning)
-		g_lingo->_pc = end; /* next stmt */
+		g_lingo->_pc = end + savepc - 1; /* next stmt */
 }
 
 void Lingo::c_repeatwithcode(void) {
@@ -867,14 +867,14 @@ void Lingo::c_repeatwithcode(void) {
 		error("Cast ref used as index: %s", countername.c_str());
 	}
 
-	g_lingo->execute(init);	/* condition */
+	g_lingo->execute(init + savepc - 1);	/* condition */
 	d = g_lingo->pop();
 	d.toInt();
 	counter->u.i = d.u.i;
 	counter->type = INT;
 
 	while (true) {
-		g_lingo->execute(body);	/* body */
+		g_lingo->execute(body + savepc - 1);	/* body */
 		if (g_lingo->_returning)
 			break;
 
@@ -884,7 +884,7 @@ void Lingo::c_repeatwithcode(void) {
 		}
 
 		counter->u.i += inc;
-		g_lingo->execute(finish);	/* condition */
+		g_lingo->execute(finish + savepc - 1);	/* condition */
 		d = g_lingo->pop();
 		d.toInt();
 
@@ -893,7 +893,7 @@ void Lingo::c_repeatwithcode(void) {
 	}
 
 	if (!g_lingo->_returning)
-		g_lingo->_pc = end; /* next stmt */
+		g_lingo->_pc = end + savepc - 1; /* next stmt */
 }
 
 void Lingo::c_exitRepeat(void) {
@@ -933,7 +933,7 @@ void Lingo::c_ifcode() {
 void Lingo::c_whencode() {
 	Datum d;
 	uint start = g_lingo->_pc;
-	uint end = READ_UINT32(&(*g_lingo->_currentScript)[start]);
+	uint end = READ_UINT32(&(*g_lingo->_currentScript)[start]) + start - 1;
 	Common::String eventname((char *)&(*g_lingo->_currentScript)[start + 1]);
 
 	start += g_lingo->calcStringAlignment(eventname.c_str()) + 1;
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index d63a136..453c926 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -2270,8 +2270,8 @@ yyreduce:
 #line 201 "engines/director/lingo/lingo-gr.y"
     {
 		inst body = 0, end = 0;
-		WRITE_UINT32(&body, (yyvsp[(5) - (7)].code));
-		WRITE_UINT32(&end, (yyvsp[(6) - (7)].code));
+		WRITE_UINT32(&body, (yyvsp[(5) - (7)].code) - (yyvsp[(1) - (7)].code));
+		WRITE_UINT32(&end, (yyvsp[(6) - (7)].code) - (yyvsp[(1) - (7)].code));
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (7)].code) + 1] = body;	/* body of loop */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (7)].code) + 2] = end;	/* end, if cond fails */
 
@@ -2282,10 +2282,10 @@ yyreduce:
 #line 214 "engines/director/lingo/lingo-gr.y"
     {
 		inst init = 0, finish = 0, body = 0, end = 0, inc = 0;
-		WRITE_UINT32(&init, (yyvsp[(3) - (10)].code));
-		WRITE_UINT32(&finish, (yyvsp[(6) - (10)].code));
-		WRITE_UINT32(&body, (yyvsp[(8) - (10)].code));
-		WRITE_UINT32(&end, (yyvsp[(9) - (10)].code));
+		WRITE_UINT32(&init, (yyvsp[(3) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&finish, (yyvsp[(6) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&body, (yyvsp[(8) - (10)].code) - (yyvsp[(1) - (10)].code));
+		WRITE_UINT32(&end, (yyvsp[(9) - (10)].code) - (yyvsp[(1) - (10)].code));
 		WRITE_UINT32(&inc, 1);
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 1] = init;	/* initial count value */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (10)].code) + 2] = finish;/* final count value */
@@ -2300,10 +2300,10 @@ yyreduce:
 #line 232 "engines/director/lingo/lingo-gr.y"
     {
 		inst init = 0, finish = 0, body = 0, end = 0, inc = 0;
-		WRITE_UINT32(&init, (yyvsp[(3) - (11)].code));
-		WRITE_UINT32(&finish, (yyvsp[(7) - (11)].code));
-		WRITE_UINT32(&body, (yyvsp[(9) - (11)].code));
-		WRITE_UINT32(&end, (yyvsp[(10) - (11)].code));
+		WRITE_UINT32(&init, (yyvsp[(3) - (11)].code) - (yyvsp[(1) - (11)].code));
+		WRITE_UINT32(&finish, (yyvsp[(7) - (11)].code) - (yyvsp[(1) - (11)].code));
+		WRITE_UINT32(&body, (yyvsp[(9) - (11)].code) - (yyvsp[(1) - (11)].code));
+		WRITE_UINT32(&end, (yyvsp[(10) - (11)].code) - (yyvsp[(1) - (11)].code));
 		WRITE_UINT32(&inc, -1);
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (11)].code) + 1] = init;	/* initial count value */
 		(*g_lingo->_currentScript)[(yyvsp[(1) - (11)].code) + 2] = finish;/* final count value */
@@ -2318,7 +2318,7 @@ yyreduce:
 #line 246 "engines/director/lingo/lingo-gr.y"
     {
 			inst end = 0;
-			WRITE_UINT32(&end, (yyvsp[(3) - (3)].code));
+			WRITE_UINT32(&end, (yyvsp[(3) - (3)].code) - (yyvsp[(1) - (3)].code));
 			g_lingo->code1(STOP);
 			(*g_lingo->_currentScript)[(yyvsp[(1) - (3)].code) + 1] = end;
 		;}
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 4fb2f4c..150cad6 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -200,8 +200,8 @@ stmt: stmtoneliner
 	//
 	| repeatwhile '(' cond ')' stmtlist end ENDCLAUSE	{
 		inst body = 0, end = 0;
-		WRITE_UINT32(&body, $5);
-		WRITE_UINT32(&end, $6);
+		WRITE_UINT32(&body, $5 - $1);
+		WRITE_UINT32(&end, $6 - $1);
 		(*g_lingo->_currentScript)[$1 + 1] = body;	/* body of loop */
 		(*g_lingo->_currentScript)[$1 + 2] = end;	/* end, if cond fails */
 
@@ -213,10 +213,10 @@ stmt: stmtoneliner
 	//
 	| repeatwith '=' expr end tTO expr end stmtlist end ENDCLAUSE {
 		inst init = 0, finish = 0, body = 0, end = 0, inc = 0;
-		WRITE_UINT32(&init, $3);
-		WRITE_UINT32(&finish, $6);
-		WRITE_UINT32(&body, $8);
-		WRITE_UINT32(&end, $9);
+		WRITE_UINT32(&init, $3 - $1);
+		WRITE_UINT32(&finish, $6 - $1);
+		WRITE_UINT32(&body, $8 - $1);
+		WRITE_UINT32(&end, $9 - $1);
 		WRITE_UINT32(&inc, 1);
 		(*g_lingo->_currentScript)[$1 + 1] = init;	/* initial count value */
 		(*g_lingo->_currentScript)[$1 + 2] = finish;/* final count value */
@@ -231,10 +231,10 @@ stmt: stmtoneliner
 	//
 	| repeatwith '=' expr end tDOWN tTO expr end stmtlist end ENDCLAUSE {
 		inst init = 0, finish = 0, body = 0, end = 0, inc = 0;
-		WRITE_UINT32(&init, $3);
-		WRITE_UINT32(&finish, $7);
-		WRITE_UINT32(&body, $9);
-		WRITE_UINT32(&end, $10);
+		WRITE_UINT32(&init, $3 - $1);
+		WRITE_UINT32(&finish, $7 - $1);
+		WRITE_UINT32(&body, $9 - $1);
+		WRITE_UINT32(&end, $10 - $1);
 		WRITE_UINT32(&inc, -1);
 		(*g_lingo->_currentScript)[$1 + 1] = init;	/* initial count value */
 		(*g_lingo->_currentScript)[$1 + 2] = finish;/* final count value */
@@ -245,7 +245,7 @@ stmt: stmtoneliner
 		checkEnd($11, "repeat", true); }
 	| when stmtoneliner end {
 			inst end = 0;
-			WRITE_UINT32(&end, $3);
+			WRITE_UINT32(&end, $3 - $1);
 			g_lingo->code1(STOP);
 			(*g_lingo->_currentScript)[$1 + 1] = end;
 		}


Commit: 58d393b314d95082612193838be86b24e09c3b30
    https://github.com/scummvm/scummvm/commit/58d393b314d95082612193838be86b24e09c3b30
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T13:27:53+01:00

Commit Message:
DIRECTOR: Lingo: Fix when..then execution

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 3dead58..ca04dce 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -940,8 +940,13 @@ void Lingo::c_whencode() {
 
 	debugC(3, kDebugLingoExec, "c_whencode([%5d][%5d], %s)", start, end, eventname.c_str());
 
+	int entity = g_lingo->_currentEntityId;
+	g_lingo->_currentEntityId = 0;
+
 	g_lingo->define(eventname, start, 0, NULL, end);
 
+	g_lingo->_currentEntityId = entity;
+
 	if (debugChannelSet(3, kDebugLingoExec)) {
 		uint pc = start;
 		while (pc <= end) {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index cf0038b..32a247a 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -291,7 +291,7 @@ Symbol *Lingo::getHandler(Common::String &name) {
 }
 
 void Lingo::processEvent(LEvent event, ScriptType st, int entityId) {
-	if (entityId <= 0)
+	if (entityId < 0)
 		return;
 
 	debugC(1, kDebugEvents, "Lingo::processEvent(%s, %s, %d)", _eventHandlerTypes[event], scriptType2str(st), entityId);


Commit: bb4b96bcab8059044abbe25918005ea68150179b
    https://github.com/scummvm/scummvm/commit/bb4b96bcab8059044abbe25918005ea68150179b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T13:42:01+01:00

Commit Message:
DIRECTOR: Lingo: Avoid pushing fake values on stack

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 453c926..da928f7 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -701,13 +701,13 @@ static const yytype_uint16 yyrline[] =
      438,   444,   445,   446,   447,   448,   449,   450,   451,   452,
      453,   454,   455,   456,   457,   458,   459,   460,   461,   462,
      463,   464,   465,   466,   467,   468,   469,   470,   471,   472,
-     473,   474,   475,   478,   483,   484,   485,   486,   487,   489,
-     490,   491,   492,   495,   498,   501,   505,   506,   507,   508,
-     509,   510,   511,   514,   515,   518,   519,   522,   523,   534,
-     535,   536,   537,   540,   543,   548,   549,   552,   553,   556,
-     557,   560,   563,   566,   566,   596,   596,   602,   605,   605,
-     610,   611,   610,   621,   622,   623,   624,   627,   631,   639,
-     640,   641,   644,   645
+     473,   474,   475,   478,   483,   484,   485,   486,   487,   488,
+     489,   490,   491,   494,   497,   500,   504,   505,   506,   507,
+     508,   509,   510,   513,   514,   517,   518,   521,   522,   533,
+     534,   535,   536,   539,   542,   547,   548,   551,   552,   555,
+     556,   559,   562,   565,   565,   595,   595,   600,   603,   603,
+     608,   609,   608,   618,   619,   620,   621,   624,   628,   636,
+     637,   638,   641,   642
 };
 #endif
 
@@ -2261,11 +2261,6 @@ yyreduce:
 		(yyval.code) = (yyvsp[(5) - (5)].code); ;}
     break;
 
-  case 20:
-#line 191 "engines/director/lingo/lingo-gr.y"
-    { g_lingo->code1(g_lingo->c_xpop); ;}
-    break;
-
   case 24:
 #line 201 "engines/director/lingo/lingo-gr.y"
     {
@@ -2790,33 +2785,32 @@ yyreduce:
 
   case 108:
 #line 487 "engines/director/lingo/lingo-gr.y"
-    { g_lingo->codeConst(0); // Push fake value on stack
-							  g_lingo->code1(g_lingo->c_procret); ;}
+    { g_lingo->code1(g_lingo->c_procret); ;}
     break;
 
   case 112:
-#line 492 "engines/director/lingo/lingo-gr.y"
+#line 491 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeFunc((yyvsp[(1) - (1)].s), 0);
 		delete (yyvsp[(1) - (1)].s); ;}
     break;
 
   case 113:
-#line 495 "engines/director/lingo/lingo-gr.y"
+#line 494 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeFunc((yyvsp[(1) - (2)].s), 1);
 		delete (yyvsp[(1) - (2)].s); ;}
     break;
 
   case 114:
-#line 498 "engines/director/lingo/lingo-gr.y"
+#line 497 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeFunc((yyvsp[(1) - (2)].s), 1);
 		delete (yyvsp[(1) - (2)].s); ;}
     break;
 
   case 115:
-#line 501 "engines/director/lingo/lingo-gr.y"
+#line 500 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->code1(g_lingo->c_voidpush);
 		g_lingo->codeFunc((yyvsp[(1) - (1)].s), 1);
@@ -2824,172 +2818,171 @@ yyreduce:
     break;
 
   case 116:
-#line 505 "engines/director/lingo/lingo-gr.y"
+#line 504 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeFunc((yyvsp[(1) - (2)].s), (yyvsp[(2) - (2)].narg)); ;}
     break;
 
   case 117:
-#line 506 "engines/director/lingo/lingo-gr.y"
+#line 505 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeFunc((yyvsp[(1) - (4)].s), (yyvsp[(3) - (4)].narg)); ;}
     break;
 
   case 118:
-#line 507 "engines/director/lingo/lingo-gr.y"
+#line 506 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeMe((yyvsp[(3) - (4)].s), 0); ;}
     break;
 
   case 119:
-#line 508 "engines/director/lingo/lingo-gr.y"
+#line 507 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeMe((yyvsp[(3) - (6)].s), (yyvsp[(5) - (6)].narg)); ;}
     break;
 
   case 120:
-#line 509 "engines/director/lingo/lingo-gr.y"
+#line 508 "engines/director/lingo/lingo-gr.y"
     { g_lingo->code1(g_lingo->c_open); ;}
     break;
 
   case 121:
-#line 510 "engines/director/lingo/lingo-gr.y"
+#line 509 "engines/director/lingo/lingo-gr.y"
     { g_lingo->code2(g_lingo->c_voidpush, g_lingo->c_open); ;}
     break;
 
   case 122:
-#line 511 "engines/director/lingo/lingo-gr.y"
+#line 510 "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 123:
-#line 514 "engines/director/lingo/lingo-gr.y"
+#line 513 "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 124:
-#line 515 "engines/director/lingo/lingo-gr.y"
+#line 514 "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 125:
-#line 518 "engines/director/lingo/lingo-gr.y"
+#line 517 "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 126:
-#line 519 "engines/director/lingo/lingo-gr.y"
+#line 518 "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 127:
-#line 522 "engines/director/lingo/lingo-gr.y"
+#line 521 "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 128:
-#line 523 "engines/director/lingo/lingo-gr.y"
+#line 522 "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 129:
-#line 534 "engines/director/lingo/lingo-gr.y"
+#line 533 "engines/director/lingo/lingo-gr.y"
     { g_lingo->code1(g_lingo->c_gotoloop); ;}
     break;
 
   case 130:
-#line 535 "engines/director/lingo/lingo-gr.y"
+#line 534 "engines/director/lingo/lingo-gr.y"
     { g_lingo->code1(g_lingo->c_gotonext); ;}
     break;
 
   case 131:
-#line 536 "engines/director/lingo/lingo-gr.y"
+#line 535 "engines/director/lingo/lingo-gr.y"
     { g_lingo->code1(g_lingo->c_gotoprevious); ;}
     break;
 
   case 132:
-#line 537 "engines/director/lingo/lingo-gr.y"
+#line 536 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeConst(1);
 		g_lingo->code1(g_lingo->c_goto); ;}
     break;
 
   case 133:
-#line 540 "engines/director/lingo/lingo-gr.y"
+#line 539 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeConst(3);
 		g_lingo->code1(g_lingo->c_goto); ;}
     break;
 
   case 134:
-#line 543 "engines/director/lingo/lingo-gr.y"
+#line 542 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeConst(2);
 		g_lingo->code1(g_lingo->c_goto); ;}
     break;
 
   case 139:
-#line 556 "engines/director/lingo/lingo-gr.y"
+#line 555 "engines/director/lingo/lingo-gr.y"
     { g_lingo->code1(g_lingo->c_playdone); ;}
     break;
 
   case 140:
-#line 557 "engines/director/lingo/lingo-gr.y"
+#line 556 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeConst(1);
 		g_lingo->code1(g_lingo->c_play); ;}
     break;
 
   case 141:
-#line 560 "engines/director/lingo/lingo-gr.y"
+#line 559 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeConst(3);
 		g_lingo->code1(g_lingo->c_play); ;}
     break;
 
   case 142:
-#line 563 "engines/director/lingo/lingo-gr.y"
+#line 562 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeConst(2);
 		g_lingo->code1(g_lingo->c_play); ;}
     break;
 
   case 143:
-#line 566 "engines/director/lingo/lingo-gr.y"
+#line 565 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeSetImmediate(true); ;}
     break;
 
   case 144:
-#line 566 "engines/director/lingo/lingo-gr.y"
+#line 565 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[(1) - (3)].s), (yyvsp[(3) - (3)].narg)); ;}
     break;
 
   case 145:
-#line 596 "engines/director/lingo/lingo-gr.y"
+#line 595 "engines/director/lingo/lingo-gr.y"
     { g_lingo->_indef = true; g_lingo->_currentFactory.clear(); ;}
     break;
 
   case 146:
-#line 597 "engines/director/lingo/lingo-gr.y"
+#line 596 "engines/director/lingo/lingo-gr.y"
     {
-			g_lingo->codeConst(0); // Push fake value on stack
 			g_lingo->code1(g_lingo->c_procret);
 			g_lingo->define(*(yyvsp[(2) - (8)].s), (yyvsp[(4) - (8)].code), (yyvsp[(5) - (8)].narg));
 			g_lingo->_indef = false; ;}
     break;
 
   case 147:
-#line 602 "engines/director/lingo/lingo-gr.y"
+#line 600 "engines/director/lingo/lingo-gr.y"
     {
 			g_lingo->codeFactory(*(yyvsp[(2) - (2)].s));
 		;}
     break;
 
   case 148:
-#line 605 "engines/director/lingo/lingo-gr.y"
+#line 603 "engines/director/lingo/lingo-gr.y"
     { g_lingo->_indef = true; ;}
     break;
 
   case 149:
-#line 606 "engines/director/lingo/lingo-gr.y"
+#line 604 "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);
@@ -2997,19 +2990,18 @@ yyreduce:
     break;
 
   case 150:
-#line 610 "engines/director/lingo/lingo-gr.y"
+#line 608 "engines/director/lingo/lingo-gr.y"
     { g_lingo->_indef = true; g_lingo->_currentFactory.clear(); ;}
     break;
 
   case 151:
-#line 611 "engines/director/lingo/lingo-gr.y"
+#line 609 "engines/director/lingo/lingo-gr.y"
     { g_lingo->_ignoreMe = true; ;}
     break;
 
   case 152:
-#line 611 "engines/director/lingo/lingo-gr.y"
+#line 609 "engines/director/lingo/lingo-gr.y"
     {
-				g_lingo->codeConst(0); // Push fake value on stack
 				g_lingo->code1(g_lingo->c_procret);
 				g_lingo->define(*(yyvsp[(2) - (10)].s), (yyvsp[(4) - (10)].code), (yyvsp[(6) - (10)].narg));
 				g_lingo->_indef = false;
@@ -3020,32 +3012,32 @@ yyreduce:
     break;
 
   case 153:
-#line 621 "engines/director/lingo/lingo-gr.y"
+#line 618 "engines/director/lingo/lingo-gr.y"
     { (yyval.narg) = 0; ;}
     break;
 
   case 154:
-#line 622 "engines/director/lingo/lingo-gr.y"
+#line 619 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeArg((yyvsp[(1) - (1)].s)); (yyval.narg) = 1; ;}
     break;
 
   case 155:
-#line 623 "engines/director/lingo/lingo-gr.y"
+#line 620 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeArg((yyvsp[(3) - (3)].s)); (yyval.narg) = (yyvsp[(1) - (3)].narg) + 1; ;}
     break;
 
   case 156:
-#line 624 "engines/director/lingo/lingo-gr.y"
+#line 621 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeArg((yyvsp[(4) - (4)].s)); (yyval.narg) = (yyvsp[(1) - (4)].narg) + 1; ;}
     break;
 
   case 157:
-#line 627 "engines/director/lingo/lingo-gr.y"
+#line 624 "engines/director/lingo/lingo-gr.y"
     { g_lingo->codeArgStore(); ;}
     break;
 
   case 158:
-#line 631 "engines/director/lingo/lingo-gr.y"
+#line 628 "engines/director/lingo/lingo-gr.y"
     {
 		g_lingo->code1(g_lingo->c_call);
 		g_lingo->codeString((yyvsp[(1) - (2)].s)->c_str());
@@ -3055,33 +3047,33 @@ yyreduce:
     break;
 
   case 159:
-#line 639 "engines/director/lingo/lingo-gr.y"
+#line 636 "engines/director/lingo/lingo-gr.y"
     { (yyval.narg) = 0; ;}
     break;
 
   case 160:
-#line 640 "engines/director/lingo/lingo-gr.y"
+#line 637 "engines/director/lingo/lingo-gr.y"
     { (yyval.narg) = 1; ;}
     break;
 
   case 161:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 638 "engines/director/lingo/lingo-gr.y"
     { (yyval.narg) = (yyvsp[(1) - (3)].narg) + 1; ;}
     break;
 
   case 162:
-#line 644 "engines/director/lingo/lingo-gr.y"
+#line 641 "engines/director/lingo/lingo-gr.y"
     { (yyval.narg) = 1; ;}
     break;
 
   case 163:
-#line 645 "engines/director/lingo/lingo-gr.y"
+#line 642 "engines/director/lingo/lingo-gr.y"
     { (yyval.narg) = (yyvsp[(1) - (3)].narg) + 1; ;}
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 3085 "engines/director/lingo/lingo-gr.cpp"
+#line 3077 "engines/director/lingo/lingo-gr.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3295,6 +3287,6 @@ yyreturn:
 }
 
 
-#line 648 "engines/director/lingo/lingo-gr.y"
+#line 645 "engines/director/lingo/lingo-gr.y"
 
 
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 150cad6..35290c6 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -188,7 +188,7 @@ asgn: tPUT expr tINTO ID 		{
 		$$ = $5; }
 	;
 
-stmtoneliner: expr 				{ g_lingo->code1(g_lingo->c_xpop); }
+stmtoneliner: expr
 	| proc
 	;
 
@@ -484,8 +484,7 @@ proc: tPUT expr				{ g_lingo->code1(g_lingo->c_printtop); }
 	| gotofunc
 	| playfunc
 	| tEXIT tREPEAT			{ g_lingo->code1(g_lingo->c_exitRepeat); }
-	| tEXIT					{ g_lingo->codeConst(0); // Push fake value on stack
-							  g_lingo->code1(g_lingo->c_procret); }
+	| tEXIT					{ g_lingo->code1(g_lingo->c_procret); }
 	| tGLOBAL globallist
 	| tPROPERTY propertylist
 	| tINSTANCE instancelist
@@ -595,7 +594,6 @@ playfunc: tPLAY tDONE			{ g_lingo->code1(g_lingo->c_playdone); }
 //   on keyword
 defn: tMACRO ID { g_lingo->_indef = true; g_lingo->_currentFactory.clear(); }
 		begin argdef nl argstore stmtlist 		{
-			g_lingo->codeConst(0); // Push fake value on stack
 			g_lingo->code1(g_lingo->c_procret);
 			g_lingo->define(*$2, $4, $5);
 			g_lingo->_indef = false; }
@@ -609,7 +607,6 @@ defn: tMACRO ID { g_lingo->_indef = true; g_lingo->_currentFactory.clear(); }
 			g_lingo->_indef = false; }	;
 	| tON ID { g_lingo->_indef = true; g_lingo->_currentFactory.clear(); }			// D3
 		begin { g_lingo->_ignoreMe = true; } argdef nl argstore stmtlist ENDCLAUSE	{
-				g_lingo->codeConst(0); // Push fake value on stack
 				g_lingo->code1(g_lingo->c_procret);
 				g_lingo->define(*$2, $4, $6);
 				g_lingo->_indef = false;


Commit: b36d5174067fecb87ab9c1b1881757fefbc300ae
    https://github.com/scummvm/scummvm/commit/b36d5174067fecb87ab9c1b1881757fefbc300ae
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T15:38:24+01:00

Commit Message:
DIRECTOR: Lingo: Fixed stack underflow in handler execution

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index ca04dce..f976434 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -142,7 +142,7 @@ void Lingo::pushVoid() {
 
 Datum Lingo::pop(void) {
 	if (_stack.size() == 0)
-		error("stack underflow");
+		assert(0);
 
 	Datum ret = _stack.back();
 	_stack.pop_back();
@@ -1126,7 +1126,7 @@ void Lingo::call(Common::String name, int nargs) {
 
 void Lingo::c_procret() {
 	if (!g_lingo->_callstack.size()) {
-		warning("Call stack underflow");
+		warning("c_procret: Call stack underflow");
 		g_lingo->_returning = true;
 		return;
 	}
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 32a247a..91faf68 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -303,7 +303,6 @@ void Lingo::processEvent(LEvent event, ScriptType st, int entityId) {
 
 	if (_handlers.contains(ENTITY_INDEX(event, entityId))) {
 		call(_eventHandlerTypes[event], 0); // D4+ Events
-		pop();
 	} else if (_scripts[st].contains(entityId)) {
 		executeScript(st, entityId); // D3 list of scripts.
 	} else {


Commit: 4cdb198f7898075f2cd2ed47067300a89a51d853
    https://github.com/scummvm/scummvm/commit/4cdb198f7898075f2cd2ed47067300a89a51d853
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T15:42:37+01:00

Commit Message:
DIRECTOR: Lingo: Fix stack overflow when assigning 'the' entity

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index f976434..b59c2c2 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -422,8 +422,6 @@ void Lingo::c_theentityassign() {
 
 	Datum d = g_lingo->pop();
 	g_lingo->setTheEntity(entity, id, field, d);
-
-	g_lingo->push(d); // Dummy value
 }
 
 void Lingo::c_swap() {


Commit: c03ee226ae32ae0dd60a4e6c7b551fdbb236bf2a
    https://github.com/scummvm/scummvm/commit/c03ee226ae32ae0dd60a4e6c7b551fdbb236bf2a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T15:55:06+01:00

Commit Message:
DIRECTOR: Added sanity check when drawing text

Changed paths:
    engines/director/frame.cpp


diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index 3c73b82..d20026c 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -915,6 +915,11 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteId, Commo
 		// textCast->fontId = _vm->_wm->_fontMan->getFontIdByName(_vm->getCurrentScore()->_fontMap[textCast->fontId]);
 	}
 
+	if (width == 0 || height == 0) {
+		warning("renderText: Requested to draw on an empty surface: %d x %d", width, height);
+		return;
+	}
+
 	Graphics::MacFont macFont = Graphics::MacFont(textCast->fontId, textCast->fontSize, textCast->textSlant);
 
 	const Graphics::Font *font = _vm->_wm->_fontMan->getFont(macFont);


Commit: b9ce9f028d2224c19765750a7a9e35ac94a6e8b8
    https://github.com/scummvm/scummvm/commit/b9ce9f028d2224c19765750a7a9e35ac94a6e8b8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T15:58:28+01:00

Commit Message:
DIRECTOR: Lingo: Added type2str for REFERENCE type

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


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 91faf68..fc12b8d 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -428,6 +428,8 @@ const char *Datum::type2str(bool isk) {
 		return isk ? "#symbol" : "SYMBOL";
 	case OBJECT:
 		return isk ? "#object" : "OBJECT";
+	case REFERENCE:
+		return "REFERENCE";
 	case VAR:
 		return isk ? "#var" : "VAR";
 	default:


Commit: 59f2d1359c55f9f5d7d0c8a7985ff838946e881c
    https://github.com/scummvm/scummvm/commit/59f2d1359c55f9f5d7d0c8a7985ff838946e881c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T16:36:41+01:00

Commit Message:
DIRECTOR: Simplified version checks and added more debug output

Changed paths:
    engines/director/cast.cpp
    engines/director/score.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index ed5b056..4b391bd 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -83,7 +83,7 @@ TextCast::TextCast(Common::ReadStreamEndian &stream, uint16 version) {
 	textSlant = 0;
 	palinfo1 = palinfo2 = palinfo3 = 0;
 
-	if (version < 4) {
+	if (version <= 3) {
 		flags1 = stream.readByte();
 		borderSize = static_cast<SizeType>(stream.readByte());
 		gutterSize = static_cast<SizeType>(stream.readByte());
@@ -115,7 +115,7 @@ TextCast::TextCast(Common::ReadStreamEndian &stream, uint16 version) {
 		fontId = stream.readByte();
 		fontSize = stream.readByte();
 		textSlant = 0;
-	} else if (version < 5) {
+	} else if (version == 4) {
 		borderSize = static_cast<SizeType>(stream.readByte());
 		gutterSize = static_cast<SizeType>(stream.readByte());
 		boxShadow = static_cast<SizeType>(stream.readByte());
@@ -134,7 +134,7 @@ TextCast::TextCast(Common::ReadStreamEndian &stream, uint16 version) {
 		byte flags = stream.readByte();
 
 		if (flags)
-			warning("Unproxessed text cast flags: %x", flags);
+			warning("Unprocessed text cast flags: %x", flags);
 
 		fontSize = stream.readUint16();
 		textSlant = 0;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 975c6ef..9987ab5 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -302,6 +302,9 @@ void Score::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
 		if (size == 0)
 			continue;
 
+		if (debugChannelSet(5, kDebugLoading))
+			stream.hexdump(size);
+
 		uint8 castType = stream.readByte();
 
 		switch (castType) {
@@ -361,7 +364,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 	uint32 size1, size2, size3, castType;
 	byte unk1 = 0, unk2 = 0, unk3 = 0;
 
-	if (_vm->getVersion() < 4) {
+	if (_vm->getVersion() <= 3) {
 		size1 = stream.readUint16();
 		size2 = stream.readUint32();
 		size3 = 0;
@@ -369,7 +372,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 		unk1 = stream.readByte();
 		unk2 = stream.readByte();
 		unk3 = stream.readByte();
-	} else if (_vm->getVersion() < 5) {
+	} else if (_vm->getVersion() == 4) {
 		size1 = stream.readUint16() + 2;
 		size2 = stream.readUint32();
 		size3 = 0;


Commit: d2fe6628f2ac6542f6c39ffeff06c254be52a5e8
    https://github.com/scummvm/scummvm/commit/d2fe6628f2ac6542f6c39ffeff06c254be52a5e8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T16:47:14+01:00

Commit Message:
DIRECTOR: Added more debug output

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 9987ab5..eb40992 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -650,6 +650,9 @@ void Score::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id)
 	ci->fileName = getString(castStrings[3]);
 	ci->type = castStrings[4];
 
+	debugC(5, kDebugLoading, "CastInfo: name: '%s' directory: '%s', fileName: '%s', type: '%s'",
+				ci->name.c_str(), ci->directory.c_str(), ci->fileName.c_str(), ci->type.c_str());
+
 	_castsInfo[id] = ci;
 }
 


Commit: 9cdeb4c88ec5dafba4640c3cc442b9486a068ba7
    https://github.com/scummvm/scummvm/commit/9cdeb4c88ec5dafba4640c3cc442b9486a068ba7
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T17:05:08+01:00

Commit Message:
DIRECTOR: Lingo: Implemented b_field() method

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index f4c26a2..6411c59 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1505,7 +1505,21 @@ void Lingo::b_cast(int nargs) {
 void Lingo::b_field(int nargs) {
 	Datum d = g_lingo->pop();
 
-	warning("STUB: b_field");
+	int id;
+
+	if (d.type == STRING) {
+		if (g_director->getCurrentScore()->_castsNames.contains(*d.u.s))
+			id = g_director->getCurrentScore()->_castsNames[*d.u.s];
+		else
+			error("b_filed: Reference to non-existent field: %s", d.u.s->c_str());
+	} else if (d.type == INT || d.type == FLOAT) {
+		d.toInt();
+		id = d.u.i;
+	} else {
+		error("b_field: Incorrect reference type: %s", d.type2str());
+	}
+
+	d.u.i = id;
 
 	d.type = REFERENCE;
 
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index eb40992..b876b77 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -653,6 +653,9 @@ void Score::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id)
 	debugC(5, kDebugLoading, "CastInfo: name: '%s' directory: '%s', fileName: '%s', type: '%s'",
 				ci->name.c_str(), ci->directory.c_str(), ci->fileName.c_str(), ci->type.c_str());
 
+	if (!ci->name.empty())
+		_castsNames[ci->name] = id;
+
 	_castsInfo[id] = ci;
 }
 
diff --git a/engines/director/score.h b/engines/director/score.h
index 6db5e33..2e762f0 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -102,6 +102,7 @@ public:
 	Common::Array<Frame *> _frames;
 	Common::HashMap<int, Cast *> _casts;
 	Common::HashMap<uint16, CastInfo *> _castsInfo;
+	Common::HashMap<Common::String, int> _castsNames;
 	Common::SortedArray<Label *> *_labels;
 	Common::HashMap<uint16, Common::String> _actions;
 	Common::HashMap<uint16, Common::String> _fontMap;


Commit: a441f4a047b8af8c48a29677c95d6d2268f81982
    https://github.com/scummvm/scummvm/commit/a441f4a047b8af8c48a29677c95d6d2268f81982
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2017-02-22T17:18:55+01:00

Commit Message:
DIRECTOR: Lingo: Initial code for field assignments

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index b59c2c2..4841986 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -43,6 +43,7 @@
 // ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 // THIS SOFTWARE.
 
+#include "director/cast.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-gr.h"
 
@@ -305,6 +306,12 @@ void Lingo::c_assign() {
 	}
 
 	if (d1.type == REFERENCE) {
+		if (!g_director->getCurrentScore()->_castsInfo.contains(d1.u.i)) {
+			warning("c_assign: Unknown REFERENCE %d", d1.u.i);
+			g_lingo->pushVoid();
+			return;
+		}
+
 		warning("STUB: c_assing REFERENCE");
 
 		g_lingo->push(d1);





More information about the Scummvm-git-logs mailing list