aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-12-16 12:16:45 +0100
committerKim Alvefur <zash@zash.se>2021-12-16 12:16:45 +0100
commit081647ea1ffaf7bf932e727c9311e765b642da5b (patch)
treede2384b2981bf7c5f94fe5ca3547bb09b86a984e
parent81d747b6a48402d86b97442866842e4feffca8b9 (diff)
downloadprosody-081647ea1ffaf7bf932e727c9311e765b642da5b.tar.gz
prosody-081647ea1ffaf7bf932e727c9311e765b642da5b.zip
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
There was an off-by-one in the modulo calculation. Switching to a plain old array-table makes the apparent size of the queue wrong, but since some of the queue may not be available this is likely for the best.
-rw-r--r--spec/util_smqueue_spec.lua26
-rw-r--r--teal-src/util/smqueue.tl21
-rw-r--r--util/smqueue.lua13
3 files changed, 36 insertions, 24 deletions
diff --git a/spec/util_smqueue_spec.lua b/spec/util_smqueue_spec.lua
index 991a656b..0a02a60b 100644
--- a/spec/util_smqueue_spec.lua
+++ b/spec/util_smqueue_spec.lua
@@ -52,4 +52,30 @@ describe("util.smqueue", function()
assert.same({ [7] = true; [8] = true; [9] = true; [10] = true; [11] = true; [12] = true }, resume);
end)
end)
+
+ describe("#table", function ()
+ it("produces a compat layer", function ()
+ local q = smqueue.new(10);
+ for i = 1,10 do q:push(i); end
+ do
+ local t = q:table();
+ assert.same({ 1; 2; 3; 4; 5; 6; 7; 8; 9; 10 }, t);
+ end
+ do
+ for i = 11,20 do q:push(i); end
+ local t = q:table();
+ assert.same({ 11; 12; 13; 14; 15; 16; 17; 18; 19; 20 }, t);
+ end
+ do
+ q:ack(15);
+ local t = q:table();
+ assert.same({ 16; 17; 18; 19; 20 }, t);
+ end
+ do
+ q:ack(20);
+ local t = q:table();
+ assert.same({}, t);
+ end
+ end)
+ end)
end);
diff --git a/teal-src/util/smqueue.tl b/teal-src/util/smqueue.tl
index 26bebe60..e149dde7 100644
--- a/teal-src/util/smqueue.tl
+++ b/teal-src/util/smqueue.tl
@@ -70,22 +70,13 @@ function smqueue:consume() : queue.queue.consume_iter
return self._queue:consume()
end
--- Compatibility wrapper, meant to look like a plain ol' array
-local record compat_mt
- _queue : smqueue<any>
-end
-
-function compat_mt:__index(i : integer) : any
- if i < self._queue._tail then return nil end
- return self._queue._queue._items[(i + self._queue._tail) % self._queue._queue.size];
-end
-
-function compat_mt:__len() : integer
- return self._queue:count_unacked()
-end
-
+-- Compatibility layer, plain ol' table
function smqueue:table() : { any }
- return setmetatable({ _queue = self }, compat_mt);
+ local t : { any } = {};
+ for i, v in self:resume() do
+ t[i] = v;
+ end
+ return t;
end
local function freeze(q : smqueue<any>) : { string:integer }
diff --git a/util/smqueue.lua b/util/smqueue.lua
index d24c35ae..6d8348d4 100644
--- a/util/smqueue.lua
+++ b/util/smqueue.lua
@@ -38,17 +38,12 @@ function smqueue:resume() return self._queue:items() end
function smqueue:consume() return self._queue:consume() end
-local compat_mt = {}
-
-function compat_mt:__index(i)
- if i < self._queue._tail then return nil end
- return self._queue._queue._items[(i + self._queue._tail) % self._queue._queue.size]
+function smqueue:table()
+ local t = {};
+ for i, v in self:resume() do t[i] = v; end
+ return t
end
-function compat_mt:__len() return self._queue:count_unacked() end
-
-function smqueue:table() return setmetatable({ _queue = self }, compat_mt) end
-
local function freeze(q) return { head = q._head; tail = q._tail } end
local queue_mt = { __name = "smqueue"; __index = smqueue; __len = smqueue.count_unacked; __freeze = freeze }