util.bitops: Library to find appropriate bitwise library (closes #1395)

This commit is contained in:
Kim Alvefur 2019-07-22 01:58:57 +02:00
parent 42861396cd
commit 3dcfc5ee71
3 changed files with 40 additions and 2 deletions

View file

@ -9,8 +9,7 @@
local softreq = require "util.dependencies".softreq;
local random_bytes = require "util.random".bytes;
local bit = assert(softreq"bit32" or softreq"bit",
"No bit module found. See https://prosody.im/doc/depends#bitop");
local bit = require "util.bitcompat";
local band = bit.band;
local bor = bit.bor;
local bxor = bit.bxor;

7
util/bit53.lua Normal file
View file

@ -0,0 +1,7 @@
-- Only the operators needed by net.websocket.frames are provided at this point
return {
band = function (a, b) return a & b end;
bor = function (a, b) return a | b end;
bxor = function (a, b) return a ~ b end;
};

32
util/bitcompat.lua Normal file
View file

@ -0,0 +1,32 @@
-- Compatibility layer for bitwise operations
-- First try the bit32 lib
-- Lua 5.3 has it with compat enabled
-- Lua 5.2 has it by default
if _G.bit32 then
return _G.bit32;
else
-- Lua 5.1 may have it as a standalone module that can be installed
local ok, bitop = pcall(require, "bit32")
if ok then
return bitop;
end
end
do
-- Lua 5.3 and 5.4 would be able to use native infix operators
local ok, bitop = pcall(require, "util.bit53")
if ok then
return bitop;
end
end
do
-- Lastly, try the LuaJIT bitop library
local ok, bitop = pcall(require, "bit")
if ok then
return bitop;
end
end
error "No bit module found. See https://prosody.im/doc/depends#bitop";