mirror of https://github.com/openwrt/luci.git
luci-compat: fix evaluating `or()` and `and()` datatype expressions
Fixes: #5705 Signed-off-by: Jo-Philipp Wich <jo@mein.io>pull/5720/head
parent
315a592d9b
commit
03bb0e2493
|
@ -13,34 +13,49 @@ module "luci.cbi.datatypes"
|
|||
|
||||
|
||||
_M['or'] = function(v, ...)
|
||||
local i
|
||||
for i = 1, select('#', ...), 2 do
|
||||
local i, n = 1, select('#', ...)
|
||||
while i <= n do
|
||||
local f = select(i, ...)
|
||||
local a = select(i+1, ...)
|
||||
if type(f) ~= "function" then
|
||||
if f == v then
|
||||
i = i + 1
|
||||
local c = v
|
||||
if type(f) == "number" then
|
||||
c = tonumber(c)
|
||||
end
|
||||
if f == c then
|
||||
return true
|
||||
end
|
||||
else
|
||||
i = i + 2
|
||||
local a = select(i-1, ...)
|
||||
if f(v, unpack(a)) then
|
||||
return true
|
||||
end
|
||||
i = i - 1
|
||||
elseif f(v, unpack(a)) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
_M['and'] = function(v, ...)
|
||||
local i
|
||||
for i = 1, select('#', ...), 2 do
|
||||
local i, n = 1, select('#', ...)
|
||||
while i <= n do
|
||||
local f = select(i, ...)
|
||||
local a = select(i+1, ...)
|
||||
if type(f) ~= "function" then
|
||||
if f ~= v then
|
||||
i = i + 1
|
||||
local c = v
|
||||
if type(f) == "number" then
|
||||
c = tonumber(c)
|
||||
end
|
||||
if f ~= c then
|
||||
return false
|
||||
end
|
||||
i = i - 1
|
||||
elseif not f(v, unpack(a)) then
|
||||
return false
|
||||
else
|
||||
i = i + 2
|
||||
local a = select(i-1, ...)
|
||||
if not f(v, unpack(a)) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
return true
|
||||
|
|
Loading…
Reference in New Issue