From 4d30baa2f279df629f4f12d1bd783c48766792f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Jan=20Fialka?= Date: Fri, 20 Feb 2026 09:04:04 +0100 Subject: [PATCH] [Space Lua] Fix: `table.sort` comparator returns 0 for ties, not 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Returning `1` when the comparator yields `false`/`nil` declares `a > b` for equal elements. `asyncQuickSort` tolerates this today but any future sort algorithm change could corrupt results. Changed to `0` so ties are neutral. Signed-off-by: Matouš Jan Fialka --- client/space_lua/stdlib/table.ts | 4 ++-- client/space_lua/stdlib/table_test.lua | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/client/space_lua/stdlib/table.ts b/client/space_lua/stdlib/table.ts index 18d1de07..ea036088 100644 --- a/client/space_lua/stdlib/table.ts +++ b/client/space_lua/stdlib/table.ts @@ -266,7 +266,7 @@ export const tableApi = new LuaTable({ if (Array.isArray(tbl)) { return await asyncQuickSort(tbl, async (a, b) => { if (comp) { - return (await comp.call(sf, a, b)) ? -1 : 1; + return (await comp.call(sf, a, b)) ? -1 : 0; } return (a as any) < (b as any) ? -1 : 1; }); @@ -286,7 +286,7 @@ export const tableApi = new LuaTable({ const cmp = async (a: any, b: any): Promise => { if (comp) { const r = await luaCall(comp, [a, b], sf.astCtx ?? {}, sf); - return r ? -1 : 1; + return r ? -1 : 0; } const av = isTaggedFloat(a) ? a.value : a; diff --git a/client/space_lua/stdlib/table_test.lua b/client/space_lua/stdlib/table_test.lua index 997357c6..38db391b 100644 --- a/client/space_lua/stdlib/table_test.lua +++ b/client/space_lua/stdlib/table_test.lua @@ -185,6 +185,9 @@ do table.sort(t, function(a, b) return a > b end) assertEqual(t, { 3, 2, 1 }) + table.sort(t, function(a, b) return a < b end) + assertEqual(t, { 3, 2, 1 }) + local data = { { name = "John", age = 30 }, { name = "Jane", age = 25 } } table.sort(data, function(a, b) return a.age < b.age end) assertEqual(data[1].name, "Jane")