[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