This is an automated email from the ASF dual-hosted git repository. membphis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-apisix.git
The following commit(s) were added to refs/heads/master by this push: new a4509b6 chore: improve the preallocation in deepcopy method (#1298) a4509b6 is described below commit a4509b6d9edcc70d124e7ee0cb736438c8bc4d04 Author: 罗泽轩 <spacewander...@gmail.com> AuthorDate: Thu Mar 19 08:12:33 2020 +0800 chore: improve the preallocation in deepcopy method (#1298) --- lua/apisix/core/table.lua | 6 +++++- t/core/table.t | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lua/apisix/core/table.lua b/lua/apisix/core/table.lua index f222789..0fc64ac 100644 --- a/lua/apisix/core/table.lua +++ b/lua/apisix/core/table.lua @@ -71,7 +71,11 @@ local function deepcopy(orig) return orig end - local copy = new_tab(0, nkeys(orig)) + -- If the array-like table contains nil in the middle, + -- the len might be smaller than the expected. + -- But it doesn't affect the correctness. + local len = #orig + local copy = new_tab(len, nkeys(orig) - len) for orig_key, orig_value in pairs(orig) do copy[orig_key] = deepcopy(orig_value) end diff --git a/t/core/table.t b/t/core/table.t index 428608f..59c8875 100644 --- a/t/core/table.t +++ b/t/core/table.t @@ -45,3 +45,35 @@ encode: ["first","a",1,true] encode: ["a",1,true,true] --- no_error_log [error] + + + +=== TEST 2: deepcopy +--- config + location /t { + content_by_lua_block { + local core = require("apisix.core") + local deepcopy = core.table.deepcopy + local cases = { + {t = {1, 2, a = {2, 3}}}, + {t = {{a = b}, 2, true}}, + {t = {{a = b}, {{a = c}, {}, 1}, true}}, + } + for _, case in ipairs(cases) do + local t = case.t + local actual = core.json.encode(deepcopy(t)) + local expect = core.json.encode(t) + if actual ~= expect then + ngx.say("expect ", expect, ", actual ", actual) + return + end + end + ngx.say("ok") + } + } +--- request +GET /t +--- response_body +ok +--- no_error_log +[error]