Strip whitespace where possible

This can save a lot of space (in one case bringing the serialized size
down from 11.5MB to 8.6MB).
This commit is contained in:
Robin Wellner 2015-05-20 02:13:34 +02:00
parent 8cf0f0df6e
commit 599c25f154
2 changed files with 24 additions and 24 deletions

20
ser.lua
View File

@ -36,9 +36,9 @@ local kw = {['and'] = true, ['break'] = true, ['do'] = true, ['else'] = true,
['until'] = true, ['while'] = true} ['until'] = true, ['while'] = true}
local function write_key_value_pair(k, v, memo, rev_memo, name) local function write_key_value_pair(k, v, memo, rev_memo, name)
if type(k) == 'string' and k:match '^[_%a][_%w]*$' and not kw[k] then if type(k) == 'string' and k:match '^[_%a][_%w]*$' and not kw[k] then
return (name and name .. '.' or '') .. k ..' = ' .. write(v, memo, rev_memo) return (name and name .. '.' or '') .. k ..'=' .. write(v, memo, rev_memo)
else else
return (name or '') .. '[' .. write(k, memo, rev_memo) .. '] = ' .. write(v, memo, rev_memo) return (name or '') .. '[' .. write(k, memo, rev_memo) .. ']=' .. write(v, memo, rev_memo)
end end
end end
@ -53,19 +53,19 @@ end
local function write_table_ex(t, memo, rev_memo, srefs, name) local function write_table_ex(t, memo, rev_memo, srefs, name)
if type(t) == 'function' then if type(t) == 'function' then
return '_[' .. name .. '] = loadstring ' .. make_safe(dump(t)) return '_[' .. name .. ']=loadstring' .. make_safe(dump(t))
end end
local m = {'_[', name, '] = {'} local m = {'_[', name, ']={'}
local mi = 3 local mi = 3
for i = 1, #t do -- don't use ipairs here, we need the gaps for i = 1, #t do -- don't use ipairs here, we need the gaps
local v = t[i] local v = t[i]
if v == t or is_cyclic(memo, v, t) then if v == t or is_cyclic(memo, v, t) then
srefs[#srefs + 1] = {name, i, v} srefs[#srefs + 1] = {name, i, v}
m[mi + 1] = 'nil, ' m[mi + 1] = 'nil,'
mi = mi + 1 mi = mi + 1
else else
m[mi + 1] = write(v, memo, rev_memo) m[mi + 1] = write(v, memo, rev_memo)
m[mi + 2] = ', ' m[mi + 2] = ','
mi = mi + 2 mi = mi + 2
end end
end end
@ -75,7 +75,7 @@ local function write_table_ex(t, memo, rev_memo, srefs, name)
srefs[#srefs + 1] = {name, k, v} srefs[#srefs + 1] = {name, k, v}
else else
m[mi + 1] = write_key_value_pair(k, v, memo, rev_memo) m[mi + 1] = write_key_value_pair(k, v, memo, rev_memo)
m[mi + 2] = ', ' m[mi + 2] = ','
mi = mi + 2 mi = mi + 2
end end
end end
@ -110,13 +110,13 @@ return function(t)
end end
-- phase 4: add something about returning the main table -- phase 4: add something about returning the main table
if result[n]:sub(1, 5) == '_[0] ' then if result[n]:sub(1, 5) == '_[0]=' then
result[n] = 'return' .. result[n]:sub(7) result[n] = 'return ' .. result[n]:sub(6)
else else
result[n + 1] = 'return _[0]' result[n + 1] = 'return _[0]'
end end
-- phase 5: just concatenate everything -- phase 5: just concatenate everything
result = concat(result, '\n') result = concat(result, '\n')
return n > 1 and 'local _ = {}\n' .. result or result return n > 1 and 'local _={}\n' .. result or result
end end

View File

@ -36,37 +36,37 @@ case({}, 'return {}', 'empty table')
case({true}, 'return {true}', 'simple table') case({true}, 'return {true}', 'simple table')
case({{}}, [[ case({{}}, [[
local _ = {} local _={}
_[1] = {} _[1]={}
return {_[1]}]], 'empty table within a table') return {_[1]}]], 'empty table within a table')
local _t = {} local _t = {}
_t.self = _t _t.self = _t
case(_t, [=[local _ = {} case(_t, [=[local _={}
_[0] = {} _[0]={}
_[0].self = _[0] _[0].self=_[0]
return _[0]]=], 'simple cycle') return _[0]]=], 'simple cycle')
case_error({coroutine.create(function()end)}, './ser.lua:27: Trying to serialize unsupported type thread', 'unsupported type') case_error({coroutine.create(function()end)}, './ser.lua:27: Trying to serialize unsupported type thread', 'unsupported type')
case({"a", foo = "bar", ["3f"] = true, _1 = false, ["00"] = 9}, 'return {"a", ["3f"] = true, _1 = false, ["00"] = 9, foo = "bar"}', 'various') case({"a", foo = "bar", ["3f"] = true, _1 = false, ["00"] = 9}, 'return {"a",["3f"]=true,_1=false,["00"]=9,foo="bar"}', 'various')
case({'\127\230\255\254\128\12\0128\n\31'}, 'return {"\\127\\230\\255\\254\\128\\12\\0128\\n\\31"}', 'non-ASCII or control characters in string value') case({'\127\230\255\254\128\12\0128\n\31'}, 'return {"\\127\\230\\255\\254\\128\\12\\0128\\n\\31"}', 'non-ASCII or control characters in string value')
case({['\127\230\255\254\128\12\0128\n\31'] = '\0'}, 'return {["\\127\\230\\255\\254\\128\\12\\0128\\n\\31"] = "\\0"}', 'non-ASCII or control characters in string key') case({['\127\230\255\254\128\12\0128\n\31'] = '\0'}, 'return {["\\127\\230\\255\\254\\128\\12\\0128\\n\\31"]="\\0"}', 'non-ASCII or control characters in string key')
local x = {} local x = {}
case({x, {x}, x}, [=[ case({x, {x}, x}, [=[
local _ = {} local _={}
_[2] = {} _[2]={}
_[1] = {} _[1]={}
_[0] = {_[1], _[2], _[1]} _[0]={_[1],_[2],_[1]}
_[2][1] = _[1] _[2][1]=_[1]
return _[0]]=], 'repeated table') return _[0]]=], 'repeated table')
case({['end'] = true, ['false'] = false}, 'return {["false"] = false, ["end"] = true}', 'keywords as table keys') case({['end'] = true, ['false'] = false}, 'return {["false"]=false,["end"]=true}', 'keywords as table keys')
case({1/0, -1/0, 0/0}, 'return {1/0, -1/0, 0/0}', 'representation of infinity and NaN') case({1/0, -1/0, 0/0}, 'return {1/0,-1/0,0/0}', 'representation of infinity and NaN')
print(failed .. ' tests failed') print(failed .. ' tests failed')
print(succeeded .. ' tests succeeded') print(succeeded .. ' tests succeeded')