[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