X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Futil.lua;h=a4ea2d29f889059f5176c8880f533300885ada2b;hp=2686445def272d26ecc1b50463b6c12563521e04;hb=8c3ee6f9b7e5ab0b4edbf4838c7c1a9ee6d7df5d;hpb=d240fb4d8c7d027c7a9d5b47662ea7ccc9394801 diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index 2686445de..a4ea2d29f 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -320,7 +320,7 @@ end --- Combines two or more numerically indexed tables into one. -- @param tbl1 Table value to combine -- @param tbl2 Table value to combine --- @param tblN More values to combine +-- @param ... More tables to combine -- @return Table value containing all values of given tables function combine(...) local result = {} @@ -375,27 +375,27 @@ function clone(object, deep) return copy end --- Test whether the given table value is a numerically indexed table. -function _is_numeric_table(t) - local k = pairs(t)(t) - return ( tonumber(k) ~= nil ) + +--- Create a dynamic table which automatically creates subtables. +-- @return Dynamic Table +function dtable() + return setmetatable({}, { __index = + function(tbl, key) + return rawget(tbl, key) + or rawget(rawset(tbl, key, dtable()), key) + end + }) end + -- Serialize the contents of a table value. function _serialize_table(t) local data = "" - if _is_numeric_table(t) then - for i, v in ipairs(t) do - v = serialize_data(v) - data = data .. ( #data > 0 and ", " or "" ) .. v - end - else - for k, v in pairs(t) do - k = serialize_data(k) - v = serialize_data(v) - data = data .. ( #data > 0 and "; " or "" ) .. - '[' .. k .. '] = ' .. v - end + for k, v in pairs(t) do + k = serialize_data(k) + v = serialize_data(v) + data = data .. ( #data > 0 and ", " or "" ) .. + '[' .. k .. '] = ' .. v end return data end @@ -410,15 +410,13 @@ function serialize_data(val) if val == nil then return "nil" elseif type(val) == "number" then - return tostring(val) + return val elseif type(val) == "string" then - val = val:gsub("\\", "\\\\") - :gsub("\r", "\\r") - :gsub("\n", "\\n") - :gsub('"','\\"') - return '"' .. val .. '"' + return string.format("%q", val) elseif type(val) == "boolean" then return val and "true" or "false" + elseif type(val) == "function" then + return string.format("loadstring(%q)", get_bytecode(val)) elseif type(val) == "table" then return "{ " .. _serialize_table(val) .. " }" else @@ -441,16 +439,19 @@ end -- --- Return the current runtime bytecode of the given data. The byte code --- will be stripped before it is returned if the given value is a function. +-- will be stripped before it is returned. -- @param val Value to return as bytecode -- @return String value containing the bytecode of the given data function get_bytecode(val) + local code + if type(val) == "function" then - local code = string.dump(val) - return code and strip_bytecode(code) + code = string.dump(val) else - return string.dump( loadstring( "return " .. serialize_data(val) ) ) + code = string.dump( loadstring( "return " .. serialize_data(val) ) ) end + + return code and strip_bytecode(code) end --- Strips unnescessary lua bytecode from given string. Information like line