[Scummvm-git-logs] scummvm master -> 1ffe4b4a08ce7a92283f4481d8b4521b0af3f20b
djsrv
dservilla at gmail.com
Mon Aug 30 03:24:19 UTC 2021
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
0fa9a79c70 DIRECTOR: LINGO: Fix invalid comparison results
1ffe4b4a08 DIRECTOR: LINGO: Add invalid comparison test
Commit: 0fa9a79c70449b96f8be8980fd6aff40dbe22dc3
https://github.com/scummvm/scummvm/commit/0fa9a79c70449b96f8be8980fd6aff40dbe22dc3
Author: djsrv (dservilla at gmail.com)
Date: 2021-08-29T23:23:26-04:00
Commit Message:
DIRECTOR: LINGO: Fix invalid comparison results
Changed paths:
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-code.cpp
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
engines/director/types.h
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 4f4de8496a..059c0263b6 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -886,7 +886,7 @@ void LB::b_max(int nargs) {
uint arrsize = d.u.farr->arr.size();
for (uint i = 0; i < arrsize; i++) {
Datum item = d.u.farr->arr[i];
- if (i == 0 || item.compareTo(max) > 0) {
+ if (i == 0 || item.compareTo(max) == kCompareGreater) {
max = item;
}
}
@@ -899,7 +899,7 @@ void LB::b_max(int nargs) {
if (d.type == ARRAY) {
warning("b_max: undefined behavior: array mixed with other args");
}
- if (i == 0 || d.compareTo(max) > 0) {
+ if (i == 0 || d.compareTo(max) == kCompareGreater) {
max = d;
}
}
@@ -919,7 +919,7 @@ void LB::b_min(int nargs) {
uint arrsize = d.u.farr->arr.size();
for (uint i = 0; i < arrsize; i++) {
Datum item = d.u.farr->arr[i];
- if (i == 0 || item.compareTo(min) < 0) {
+ if (i == 0 || item.compareTo(min) == kCompareLess) {
min = item;
}
}
@@ -932,7 +932,7 @@ void LB::b_min(int nargs) {
if (d.type == ARRAY) {
warning("b_min: undefined behavior: array mixed with other args");
}
- if (i == 0 || d.compareTo(min) < 0) {
+ if (i == 0 || d.compareTo(min) == kCompareLess) {
min = d;
}
}
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 904d052255..2b4b42df34 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1302,7 +1302,7 @@ Datum LC::gtData(Datum d1, Datum d2) {
d1.type == PARRAY || d2.type == PARRAY) {
return LC::compareArrays(LC::gtData, d1, d2, false, true);
}
- d1.u.i = (d1.compareTo(d2) > 0) ? 1 : 0;
+ d1.u.i = (d1.compareTo(d2) == kCompareGreater) ? 1 : 0;
d1.type = INT;
return d1;
}
@@ -1318,7 +1318,7 @@ Datum LC::ltData(Datum d1, Datum d2) {
d1.type == PARRAY || d2.type == PARRAY) {
return LC::compareArrays(LC::ltData, d1, d2, false, true);
}
- d1.u.i = (d1.compareTo(d2) < 0) ? 1 : 0;
+ d1.u.i = (d1.compareTo(d2) == kCompareLess) ? 1 : 0;
d1.type = INT;
return d1;
}
@@ -1334,7 +1334,8 @@ Datum LC::geData(Datum d1, Datum d2) {
d1.type == PARRAY || d2.type == PARRAY) {
return LC::compareArrays(LC::geData, d1, d2, false, true);
}
- d1.u.i = (d1.compareTo(d2) >= 0) ? 1 : 0;
+ CompareResult res = d1.compareTo(d2);
+ d1.u.i = (res == kCompareGreater || res == kCompareEqual) ? 1 : 0;
d1.type = INT;
return d1;
}
@@ -1350,7 +1351,8 @@ Datum LC::leData(Datum d1, Datum d2) {
d1.type == PARRAY || d2.type == PARRAY) {
return LC::compareArrays(LC::leData, d1, d2, false, true);
}
- d1.u.i = (d1.compareTo(d2) <= 0) ? 1 : 0;
+ CompareResult res = d1.compareTo(d2);
+ d1.u.i = (res == kCompareLess || res == kCompareEqual) ? 1 : 0;
d1.type = INT;
return d1;
}
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index f7ac210b02..a817d2db7d 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1006,34 +1006,41 @@ int Datum::equalTo(Datum &d, bool ignoreCase) const {
return 0;
}
-int Datum::compareTo(Datum &d) const {
+CompareResult Datum::compareTo(Datum &d) const {
int alignType = g_lingo->getAlignedType(*this, d, false);
if (alignType == FLOAT) {
double f1 = asFloat();
double f2 = d.asFloat();
if (f1 < f2) {
- return -1;
+ return kCompareLess;
} else if (f1 == f2) {
- return 0;
+ return kCompareEqual;
} else {
- return 1;
+ return kCompareGreater;
}
} else if (alignType == INT) {
double i1 = asInt();
double i2 = d.asInt();
if (i1 < i2) {
- return -1;
+ return kCompareLess;
} else if (i1 == i2) {
- return 0;
+ return kCompareEqual;
} else {
- return 1;
+ return kCompareGreater;
}
} else if (alignType == STRING) {
- return compareStrings(asString(), d.asString());
+ int res = compareStrings(asString(), d.asString());
+ if (res < 0) {
+ return kCompareLess;
+ } else if (res == 0) {
+ return kCompareEqual;
+ } else {
+ return kCompareGreater;
+ }
} else {
warning("Invalid comparison between types %s and %s", type2str(), d.type2str());
- return 0;
+ return kCompareError;
}
}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 92fdf97bd3..6319b8471a 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -174,7 +174,7 @@ struct Datum { /* interpreter stack type */
const char *type2str(bool isk = false) const;
int equalTo(Datum &d, bool ignoreCase = false) const;
- int compareTo(Datum &d) const;
+ CompareResult compareTo(Datum &d) const;
};
struct ChunkReference {
diff --git a/engines/director/types.h b/engines/director/types.h
index ce7c3b51ba..b8bca402f0 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -382,6 +382,13 @@ struct CastMemberID {
Common::String asString() const;
};
+enum CompareResult {
+ kCompareLess,
+ kCompareEqual,
+ kCompareGreater,
+ kCompareError
+};
+
struct Datum;
struct PCell;
typedef Common::Array<Datum> DatumArray;
Commit: 1ffe4b4a08ce7a92283f4481d8b4521b0af3f20b
https://github.com/scummvm/scummvm/commit/1ffe4b4a08ce7a92283f4481d8b4521b0af3f20b
Author: djsrv (dservilla at gmail.com)
Date: 2021-08-29T23:23:26-04:00
Commit Message:
DIRECTOR: LINGO: Add invalid comparison test
Changed paths:
engines/director/lingo/tests/equality.lingo
diff --git a/engines/director/lingo/tests/equality.lingo b/engines/director/lingo/tests/equality.lingo
index 3cee555d78..b2549fc886 100644
--- a/engines/director/lingo/tests/equality.lingo
+++ b/engines/director/lingo/tests/equality.lingo
@@ -9,3 +9,6 @@ scummvmAssert(field 1 = string)
scummvmAssert(0 <> "")
scummvmAssert(1 <> cast 1)
scummvmAssert("test" <> #test)
+
+-- Invalid comparisons should return FALSE
+scummvmAssert(not ("ST_INTRO" <= 0))
More information about the Scummvm-git-logs
mailing list