[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