Mercurial > prosody-hg
comparison util/serialization.lua @ 11200:bf8f2da84007
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 05 Nov 2020 22:31:25 +0100 |
| parents | ec14d4fce855 |
| children | 22066b02887f |
comparison
equal
deleted
inserted
replaced
| 11199:6c7c50a4de32 | 11200:bf8f2da84007 |
|---|---|
| 14 local s_rep = string.rep; | 14 local s_rep = string.rep; |
| 15 local s_char = string.char; | 15 local s_char = string.char; |
| 16 local s_match = string.match; | 16 local s_match = string.match; |
| 17 local t_concat = table.concat; | 17 local t_concat = table.concat; |
| 18 | 18 |
| 19 local to_hex = require "util.hex".to; | |
| 20 | |
| 19 local pcall = pcall; | 21 local pcall = pcall; |
| 20 local envload = require"util.envload".envload; | 22 local envload = require"util.envload".envload; |
| 21 | 23 |
| 22 local pos_inf, neg_inf = math.huge, -math.huge; | 24 local pos_inf, neg_inf = math.huge, -math.huge; |
| 23 -- luacheck: ignore 143/math | |
| 24 local m_type = math.type or function (n) | 25 local m_type = math.type or function (n) |
| 25 return n % 1 == 0 and n <= 9007199254740992 and n >= -9007199254740992 and "integer" or "float"; | 26 return n % 1 == 0 and n <= 9007199254740992 and n >= -9007199254740992 and "integer" or "float"; |
| 26 end; | 27 end; |
| 27 | 28 |
| 28 local char_to_hex = {}; | 29 local function rawpairs(t) |
| 29 for i = 0,255 do | 30 return next, t, nil; |
| 30 char_to_hex[s_char(i)] = s_format("%02x", i); | |
| 31 end | |
| 32 | |
| 33 local function to_hex(s) | |
| 34 return (s_gsub(s, ".", char_to_hex)); | |
| 35 end | 31 end |
| 36 | 32 |
| 37 local function fatal_error(obj, why) | 33 local function fatal_error(obj, why) |
| 38 error("Can't serialize "..type(obj) .. (why and ": ".. why or "")); | 34 error("Can't serialize "..type(obj) .. (why and ": ".. why or "")); |
| 39 end | 35 end |
| 121 local unquoted = opt.unquoted == true and "^[%a_][%w_]*$" or opt.unquoted; | 117 local unquoted = opt.unquoted == true and "^[%a_][%w_]*$" or opt.unquoted; |
| 122 local hex = opt.hex; | 118 local hex = opt.hex; |
| 123 local freeze = opt.freeze; | 119 local freeze = opt.freeze; |
| 124 local maxdepth = opt.maxdepth or 127; | 120 local maxdepth = opt.maxdepth or 127; |
| 125 local multirefs = opt.multiref; | 121 local multirefs = opt.multiref; |
| 122 local table_pairs = opt.table_iterator or rawpairs; | |
| 126 | 123 |
| 127 -- serialize one table, recursively | 124 -- serialize one table, recursively |
| 128 -- t - table being serialized | 125 -- t - table being serialized |
| 129 -- o - array where tokens are added, concatenate to get final result | 126 -- o - array where tokens are added, concatenate to get final result |
| 130 -- - also used to detect cycles | 127 -- - also used to detect cycles |
| 151 local tag = mt.__name; | 148 local tag = mt.__name; |
| 152 local fr = mt.__freeze; | 149 local fr = mt.__freeze; |
| 153 | 150 |
| 154 if type(fr) == "function" then | 151 if type(fr) == "function" then |
| 155 t = fr(t); | 152 t = fr(t); |
| 153 if type(t) == "string" then | |
| 154 o[l], l = t, l + 1; | |
| 155 return l; | |
| 156 end | |
| 156 if type(tag) == "string" then | 157 if type(tag) == "string" then |
| 157 o[l], l = tag, l + 1; | 158 o[l], l = tag, l + 1; |
| 158 end | 159 end |
| 159 end | 160 end |
| 160 end | 161 end |
| 162 | 163 |
| 163 o[l], l = tstart, l + 1; | 164 o[l], l = tstart, l + 1; |
| 164 local indent = s_rep(indentwith, d); | 165 local indent = s_rep(indentwith, d); |
| 165 local numkey = 1; | 166 local numkey = 1; |
| 166 local ktyp, vtyp; | 167 local ktyp, vtyp; |
| 167 for k,v in next,t do | 168 local had_items = false; |
| 169 for k,v in table_pairs(t) do | |
| 170 had_items = true; | |
| 168 o[l], l = itemstart, l + 1; | 171 o[l], l = itemstart, l + 1; |
| 169 o[l], l = indent, l + 1; | 172 o[l], l = indent, l + 1; |
| 170 ktyp, vtyp = type(k), type(v); | 173 ktyp, vtyp = type(k), type(v); |
| 171 if k == numkey then | 174 if k == numkey then |
| 172 -- next index in array part | 175 -- next index in array part |
| 193 if vtyp == "table" then | 196 if vtyp == "table" then |
| 194 l = serialize_table(v, o, l, d+1); | 197 l = serialize_table(v, o, l, d+1); |
| 195 else | 198 else |
| 196 o[l], l = ser(v), l + 1; | 199 o[l], l = ser(v), l + 1; |
| 197 end | 200 end |
| 198 -- last item? | 201 o[l], l = itemsep, l + 1; |
| 199 if next(t, k) ~= nil then | 202 end |
| 200 o[l], l = itemsep, l + 1; | 203 if had_items then |
| 201 else | 204 o[l - 1] = itemlast; |
| 202 o[l], l = itemlast, l + 1; | |
| 203 end | |
| 204 end | |
| 205 if next(t) ~= nil then | |
| 206 o[l], l = s_rep(indentwith, d-1), l + 1; | 205 o[l], l = s_rep(indentwith, d-1), l + 1; |
| 207 end | 206 end |
| 208 o[l], l = tend, l +1; | 207 o[l], l = tend, l +1; |
| 209 | 208 |
| 210 if multirefs then | 209 if multirefs then |
