From: Jo-Philipp Wich Date: Thu, 4 Aug 2016 09:37:13 +0000 (+0200) Subject: luci-base: improve string format error reporting X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=240b8c4b6e5597f3f89f4382df49c123ab114c46;ds=sidebyside luci-base: improve string format error reporting In mod metamethod, execute string format under pcall() and rethrow error in caller context to report caller of function in errors and not the meta method itself. Signed-off-by: Jo-Philipp Wich --- diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua index 896e36b45..0e7334be8 100644 --- a/modules/luci-base/luasrc/util.lua +++ b/modules/luci-base/luasrc/util.lua @@ -16,7 +16,7 @@ local _ubus_connection = nil local getmetatable, setmetatable = getmetatable, setmetatable local rawget, rawset, unpack = rawget, rawset, unpack -local tostring, type, assert = tostring, type, assert +local tostring, type, assert, error = tostring, type, assert, error local ipairs, pairs, next, loadstring = ipairs, pairs, next, loadstring local require, pcall, xpcall = require, pcall, xpcall local collectgarbage, get_memory_limit = collectgarbage, get_memory_limit @@ -27,14 +27,27 @@ module "luci.util" -- Pythonic string formatting extension -- getmetatable("").__mod = function(a, b) + local ok, res + if not b then return a elseif type(b) == "table" then + local k, _ for k, _ in pairs(b) do if type(b[k]) == "userdata" then b[k] = tostring(b[k]) end end - return a:format(unpack(b)) + + ok, res = pcall(a.format, a, unpack(b)) + if not ok then + error(res, 2) + end + return res else if type(b) == "userdata" then b = tostring(b) end - return a:format(b) + + ok, res = pcall(a.format, a, b) + if not ok then + error(res, 2) + end + return res end end