[Scummvm-git-logs] scummvm master -> 21ce1227b5176bf955e5e151c1894194588dfca1

sev- noreply at scummvm.org
Fri Feb 28 17:55:58 UTC 2025


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

Summary:
769e16c299 DIRECTOR: LINGO: Persist sorted flag when duplicating arrays
7d630751f1 DIRECTOR: LINGO: Optimize man/max for sorted arrays
16e364b65a DIRECTOR: LINGO: Fix const'ness of Datum comparison operations
6b959edbeb DIRECTOR: LINGO: Use proper comparison when sorting arrays
74c3528df3 DIRECTOR: LINGO: Implement shortcut in b_sort() for sorted arrays
a179395768 DIRECTOR: LINGO: Proper comparison in b_addProp
f9fc9ff674 DIRECTOR: LINGO: Implemented b_findPos() for arrays
21ce1227b5 DIRECTOR: TESTS: added test for 'add' and 'findPos'


Commit: 769e16c299438e3f4c9de773aa76785c006a78ab
    https://github.com/scummvm/scummvm/commit/769e16c299438e3f4c9de773aa76785c006a78ab
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:47+01:00

Commit Message:
DIRECTOR: LINGO: Persist sorted flag when duplicating arrays

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


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 86a75f76766..e4f1a217963 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1293,6 +1293,7 @@ Datum Datum::clone() const {
 		for (auto &it : u.farr->arr) {
 			result.u.farr->arr.push_back(it.clone());
 		}
+		result.u.farr->_sorted = u.farr->_sorted;
 		break;
 	case PARRAY:
 		result.type = PARRAY;
@@ -1300,6 +1301,7 @@ Datum Datum::clone() const {
 		for (auto &it : u.parr->arr) {
 			result.u.parr->arr.push_back(PCell(it.p.clone(), it.v.clone()));
 		}
+		result.u.parr->_sorted = u.parr->_sorted;
 		break;
 	default:
 		result = *this;


Commit: 7d630751f171c73536dedbfa362f82d38fdf7110
    https://github.com/scummvm/scummvm/commit/7d630751f171c73536dedbfa362f82d38fdf7110
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:47+01:00

Commit Message:
DIRECTOR: LINGO: Optimize man/max for sorted arrays

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index e6fe15da353..089be1b68f7 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1096,10 +1096,15 @@ void LB::b_max(int nargs) {
 		Datum d = g_lingo->pop();
 		if (d.type == ARRAY) {
 			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 > max) {
-					max = item;
+
+			if (d.u.farr->_sorted && arrsize) {
+				max = d.u.farr->arr[arrsize - 1];
+			} else {
+				for (uint i = 0; i < arrsize; i++) {
+					Datum item = d.u.farr->arr[i];
+					if (i == 0 || item > max) {
+						max = item;
+					}
 				}
 			}
 		} else {
@@ -1129,10 +1134,15 @@ void LB::b_min(int nargs) {
 		Datum d = g_lingo->pop();
 		if (d.type == ARRAY) {
 			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 < min) {
-					min = item;
+
+			if (d.u.farr->_sorted && arrsize) {
+				min = d.u.farr->arr[0];
+			} else {
+				for (uint i = 0; i < arrsize; i++) {
+					Datum item = d.u.farr->arr[i];
+					if (i == 0 || item < min) {
+						min = item;
+					}
 				}
 			}
 		} else {


Commit: 16e364b65a5eace40791900a353757db731d6402
    https://github.com/scummvm/scummvm/commit/16e364b65a5eace40791900a353757db731d6402
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:47+01:00

Commit Message:
DIRECTOR: LINGO: Fix const'ness of Datum comparison operations

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


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index e4f1a217963..f9315be73c3 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1384,7 +1384,7 @@ const char *Datum::type2str(bool ilk) const {
 	}
 }
 
-int Datum::equalTo(Datum &d, bool ignoreCase) const {
+int Datum::equalTo(const Datum &d, bool ignoreCase) const {
 	// VOID can only be equal to VOID and INT 0
 	if (type == VOID && d.type == VOID) {
 		return 1;
@@ -1421,29 +1421,29 @@ int Datum::equalTo(Datum &d, bool ignoreCase) const {
 	return 0;
 }
 
-bool Datum::operator==(Datum &d) const {
+bool Datum::operator==(const Datum &d) const {
 	return equalTo(d);
 }
 
-bool Datum::operator>(Datum &d) const {
+bool Datum::operator>(const Datum &d) const {
 	return compareTo(d) & kCompareGreater;
 }
 
-bool Datum::operator<(Datum &d) const {
+bool Datum::operator<(const Datum &d) const {
 	return compareTo(d) & kCompareLess;
 }
 
-bool Datum::operator>=(Datum &d) const {
+bool Datum::operator>=(const Datum &d) const {
 	uint32 res = compareTo(d);
 	return res & kCompareGreater || res & kCompareEqual;
 }
 
-bool Datum::operator<=(Datum &d) const {
+bool Datum::operator<=(const Datum &d) const {
 	uint32 res = compareTo(d);
 	return res & kCompareLess || res & kCompareEqual;
 }
 
-uint32 Datum::compareTo(Datum &d) const {
+uint32 Datum::compareTo(const Datum &d) const {
 	// VOID will always be treated as:
 	// - equal to VOID
 	// - less than -and- equal to INT 0 (yes, really)
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 63a6d61a500..949a9679e51 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -179,14 +179,14 @@ struct Datum {	/* interpreter stack type */
 
 	const char *type2str(bool ilk = false) const;
 
-	int equalTo(Datum &d, bool ignoreCase = false) const;
-	uint32 compareTo(Datum &d) const;
-
-	bool operator==(Datum &d) const;
-	bool operator>(Datum &d) const;
-	bool operator<(Datum &d) const;
-	bool operator>=(Datum &d) const;
-	bool operator<=(Datum &d) const;
+	int equalTo(const Datum &d, bool ignoreCase = false) const;
+	uint32 compareTo(const Datum &d) const;
+
+	bool operator==(const Datum &d) const;
+	bool operator>(const Datum &d) const;
+	bool operator<(const Datum &d) const;
+	bool operator>=(const Datum &d) const;
+	bool operator<=(const Datum &d) const;
 };
 
 struct ChunkReference {


Commit: 6b959edbeb1b562a77c86ed55e7c7ef60c0a9ec9
    https://github.com/scummvm/scummvm/commit/6b959edbeb1b562a77c86ed55e7c7ef60c0a9ec9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:48+01:00

Commit Message:
DIRECTOR: LINGO: Use proper comparison when sorting arrays

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 089be1b68f7..e7cc67a4f85 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1265,7 +1265,7 @@ void LB::b_setProp(int nargs) {
 }
 
 static bool sortArrayHelper(const Datum &lhs, const Datum &rhs) {
-	return lhs.asString() < rhs.asString();
+	return lhs < rhs;
 }
 
 static bool sortNumericArrayHelper(const Datum &lhs, const Datum &rhs) {
@@ -1273,7 +1273,7 @@ static bool sortNumericArrayHelper(const Datum &lhs, const Datum &rhs) {
 }
 
 static bool sortPArrayHelper(const PCell &lhs, const PCell &rhs) {
-	return lhs.p.asString() < rhs.p.asString();
+	return lhs.p < rhs.p;
 }
 
 static bool sortNumericPArrayHelper(const PCell &lhs, const PCell &rhs) {


Commit: 74c3528df388e41b7c9232518de41b41d404612e
    https://github.com/scummvm/scummvm/commit/74c3528df388e41b7c9232518de41b41d404612e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:48+01:00

Commit Message:
DIRECTOR: LINGO: Implement shortcut in b_sort() for sorted arrays

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index e7cc67a4f85..7ee191b7d5a 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1288,6 +1288,9 @@ void LB::b_sort(int nargs) {
 	Datum list = g_lingo->pop();
 
 	if (list.type == ARRAY) {
+		if (list.u.farr->_sorted)
+			return;
+
 		// Check to see if the array is full of numbers
 		bool isNumeric = true;
 		for (const auto &it : list.u.farr->arr) {
@@ -1306,6 +1309,9 @@ void LB::b_sort(int nargs) {
 		list.u.farr->_sorted = true;
 
 	} else if (list.type == PARRAY) {
+		if (list.u.parr->_sorted)
+			return;
+
 		// Check to see if the array is full of numbers
 		bool isNumeric = true;
 		for (const auto &it : list.u.parr->arr) {


Commit: a17939576849a28dbdbcb2ec790bb5eceb1a0397
    https://github.com/scummvm/scummvm/commit/a17939576849a28dbdbcb2ec790bb5eceb1a0397
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:48+01:00

Commit Message:
DIRECTOR: LINGO: Proper comparison in b_addProp

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 7ee191b7d5a..8213f9793a5 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -690,7 +690,7 @@ void LB::b_addProp(int nargs) {
 		else {
 			uint pos = list.u.parr->arr.size();
 			for (uint i = 0; i < list.u.parr->arr.size(); i++) {
-				if (list.u.parr->arr[i].p.asString() > cell.p.asString()) {
+				if (list.u.parr->arr[i].p > cell.p) {
 					pos = i;
 					break;
 				}


Commit: f9fc9ff674eae34e88b44ca18e46d580cbb0f2bd
    https://github.com/scummvm/scummvm/commit/f9fc9ff674eae34e88b44ca18e46d580cbb0f2bd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:48+01:00

Commit Message:
DIRECTOR: LINGO: Implemented b_findPos() for arrays

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 8213f9793a5..5ee7d68f0ce 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -820,11 +820,26 @@ void LB::b_findPos(int nargs) {
 	Datum prop = g_lingo->pop();
 	Datum list = g_lingo->pop();
 	Datum d(g_lingo->getVoid());
-	TYPECHECK(list, PARRAY);
+	TYPECHECK2(list, ARRAY, PARRAY);
 
-	int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
-	if (index > 0) {
-		d = index;
+	if (list.type == ARRAY) {
+		if (list.u.farr->_sorted) {
+			int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
+			if (index > 0)
+				d = index;
+			else
+				d = 0;
+		} else {
+			if (prop.asInt() > 0 && prop.asInt() <= list.u.farr->arr.size())
+				d = prop.asInt();
+			else
+				d = 0;
+		}
+	} else {
+		int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
+		if (index > 0) {
+			d = index;
+		}
 	}
 
 	g_lingo->push(d);


Commit: 21ce1227b5176bf955e5e151c1894194588dfca1
    https://github.com/scummvm/scummvm/commit/21ce1227b5176bf955e5e151c1894194588dfca1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-28T18:55:48+01:00

Commit Message:
DIRECTOR: TESTS: added test for 'add' and 'findPos'

Changed paths:
    engines/director/lingo/tests/lists.lingo


diff --git a/engines/director/lingo/tests/lists.lingo b/engines/director/lingo/tests/lists.lingo
index 3e76fda9634..016fc4a2035 100644
--- a/engines/director/lingo/tests/lists.lingo
+++ b/engines/director/lingo/tests/lists.lingo
@@ -183,7 +183,13 @@ put templst
 
 
 -- add
-
+set list1 = [1, 4, 2]
+add list1, 3
+scummVMAssert(getPos(list1, 3) = 4)
+set list1 = [1, 4, 2]
+sort list1
+add list1, 3
+scummVMAssert(getPos(list1, 3) = 3)
 
 -- addAt
 
@@ -232,7 +238,22 @@ set testList to [#a: 1, #b: 2, #bb: 3, #d: 4, #e: 5]
 scummvmAssertEqual(findPos(testList, #b), 2)
 scummvmAssertEqual(findPos(testList, #f), VOID)
 
+set testList to []
+scummvmAssertEqual(findPos(testList, #3), 0)
+set testList to [1, 3, 0]
+scummvmAssertEqual(findPos(testList, 3), 3)
+scummvmAssertEqual(findPos(testList, 2), 2)
+scummvmAssertEqual(findPos(testList, 4), 0)
+scummvmAssertEqual(findPos(testList, -1), 0)
+scummvmAssertEqual(findPos(testList, 1), 1)
+sort testList
+scummvmAssertEqual(findPos(testList, 1), 2)
+scummvmAssertEqual(findPos(testList, 0), 1)
+scummvmAssertEqual(findPos(testList, 2), 0)
+scummvmAssertEqual(findPos(testList, 4), 0)
+
 -- findPosNear
+set testList to [#a: 1, #b: 2, #bb: 3, #d: 4, #e: 5]
 scummvmAssertEqual(findPosNear(testList, #f), 6)
 scummvmAssertEqual(findPosNear(testList, #d), 4)
 




More information about the Scummvm-git-logs mailing list