lua-cmsgpack icon indicating copy to clipboard operation
lua-cmsgpack copied to clipboard

cmsgpack.pack(t) got empty

Open ffbh123456 opened this issue 4 years ago • 1 comments

local cmsgpack = require("cmsgpack")

local function to_readonly_table(input_table)
    if input_table == nil then
        return nil
    end
    assert(type(input_table) == 'table')
    local travelled_tables = {}
    local function __read_only(tbl)
        if not travelled_tables[tbl] then
            local tbl_mt = getmetatable(tbl)
            if not tbl_mt then
                tbl_mt = {}
                setmetatable(tbl, tbl_mt)
            end

            local proxy = tbl_mt.__read_only_proxy
            if not proxy then
                proxy = {}
                tbl_mt.__read_only_proxy = proxy
                local proxy_mt = {
                    __index = tbl,
                    __newindex = function(t, k, v)
                        error("error write to a read-only table with key = " .. tostring(k))
                    end,
                    __pairs = function(t)
                        return pairs(tbl)
                    end,
                    __len = function(t)
                        return #tbl
                    end,
                    __read_only_proxy = proxy
                }
                setmetatable(proxy, proxy_mt)
            end
            travelled_tables[tbl] = proxy
            for k, v in pairs(tbl) do
                if type(v) == "table" then
                    tbl[k] = __read_only(v)
                end
            end
        end
        return travelled_tables[tbl]
    end
    return __read_only(input_table)
end

local t = to_readonly_table({
        a = 1,
        b = 2
    })
local tmp = cmsgpack.pack(t)
local origin = cmsgpack.unpack(tmp) -- this one become empty

ffbh123456 avatar Oct 12 '21 10:10 ffbh123456

When I set the lua table to read-only, cmsgpack.pack returns empty

ffbh123456 avatar Oct 12 '21 11:10 ffbh123456