Fix: Violation of strict weak ordering in engine name sorter

This could be caused by an engine being renamed, and the old
name being cached from a previous sort.

See: #7838
This commit is contained in:
Jonathan G Rennison 2020-06-15 18:36:33 +01:00 committed by Niels Martin Hansen
parent 084b073e57
commit d830a34394
1 changed files with 11 additions and 6 deletions

View File

@ -125,6 +125,9 @@ static bool EngineIntroDateSorter(const EngineID &a, const EngineID &b)
return _engine_sort_direction ? r > 0 : r < 0;
}
/* cached values for EngineNameSorter to spare many GetString() calls */
static EngineID _last_engine[2] = { INVALID_ENGINE, INVALID_ENGINE };
/**
* Determines order of engines by name
* @param a first engine to compare
@ -133,17 +136,16 @@ static bool EngineIntroDateSorter(const EngineID &a, const EngineID &b)
*/
static bool EngineNameSorter(const EngineID &a, const EngineID &b)
{
static EngineID last_engine[2] = { INVALID_ENGINE, INVALID_ENGINE };
static char last_name[2][64] = { "\0", "\0" };
static char last_name[2][64] = { "", "" };
if (a != last_engine[0]) {
last_engine[0] = a;
if (a != _last_engine[0]) {
_last_engine[0] = a;
SetDParam(0, a);
GetString(last_name[0], STR_ENGINE_NAME, lastof(last_name[0]));
}
if (b != last_engine[1]) {
last_engine[1] = b;
if (b != _last_engine[1]) {
_last_engine[1] = b;
SetDParam(0, b);
GetString(last_name[1], STR_ENGINE_NAME, lastof(last_name[1]));
}
@ -1292,6 +1294,9 @@ struct BuildVehicleWindow : Window {
this->SelectEngine(sel_id);
/* invalidate cached values for name sorter - engine names could change */
_last_engine[0] = _last_engine[1] = INVALID_ENGINE;
/* make engines first, and then wagons, sorted by selected sort_criteria */
_engine_sort_direction = false;
EngList_Sort(&this->eng_list, TrainEnginesThenWagonsSorter);