Skip to content
This repository was archived by the owner on Oct 13, 2021. It is now read-only.

Commit f0823a9

Browse files
committed
optimize update funcs
1 parent 17d3497 commit f0823a9

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

reload.lua

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
local reload = {}
22
local sandbox = {}
33

4+
local table = table
5+
local debug = debug
6+
47
do -- sandbox begin
58

69
local function findloader(name)
@@ -558,13 +561,25 @@ local function update_funcs(map)
558561
local root = debug.getregistry()
559562
local co = coroutine.running()
560563
local exclude = { [map] = true , [co] = true }
564+
local getmetatable = debug.getmetatable
565+
local getinfo = debug.getinfo
566+
local getlocal = debug.getlocal
567+
local setlocal = debug.setlocal
568+
local getupvalue = debug.getupvalue
569+
local setupvalue = debug.setupvalue
570+
local getuservalue = debug.getuservalue
571+
local setuservalue = debug.setuservalue
572+
local type = type
573+
local next = next
574+
local rawset = rawset
575+
561576
exclude[exclude] = true
562577

563578

564579
local update_funcs_
565580

566581
local function update_funcs_frame(co,level)
567-
local info = debug.getinfo(co, level+1, "f")
582+
local info = getinfo(co, level+1, "f")
568583
if info == nil then
569584
return
570585
end
@@ -573,7 +588,7 @@ local function update_funcs(map)
573588
update_funcs_(f)
574589
local i = 1
575590
while true do
576-
local name, v = debug.getlocal(co, level+1, i)
591+
local name, v = getlocal(co, level+1, i)
577592
if name == nil then
578593
if i > 0 then
579594
i = -1
@@ -583,7 +598,7 @@ local function update_funcs(map)
583598
end
584599
update_funcs_(v)
585600
if map[v] then
586-
debug.setlocal(co, level+1, i, map[v])
601+
setlocal(co, level+1, i, map[v])
587602
end
588603
if i > 0 then
589604
i = i + 1
@@ -601,6 +616,8 @@ local function update_funcs(map)
601616
local t = type(root)
602617
if t == "table" then
603618
exclude[root] = true
619+
local mt = getmetatable(root)
620+
if mt then update_funcs_(mt) end
604621
local tmp
605622
for k,v in next, root do
606623
update_funcs_(k)
@@ -617,7 +634,7 @@ local function update_funcs(map)
617634
end
618635
end
619636
if tmp then
620-
for k,v in pairs(tmp) do
637+
for k,v in next, tmp do
621638
if root[v] == nil then
622639
root[v] = root[k]
623640
end
@@ -626,10 +643,12 @@ local function update_funcs(map)
626643
end
627644
elseif t == "userdata" then
628645
exclude[root] = true
629-
local uv = debug.getuservalue(root)
646+
local mt = getmetatable(root)
647+
if mt then update_funcs_(mt) end
648+
local uv = getuservalue(root)
630649
if uv then
631650
if map[uv] then
632-
debug.setuservalue(root, map[uv])
651+
setuservalue(root, map[uv])
633652
else
634653
update_funcs_(uv)
635654
end
@@ -641,22 +660,24 @@ local function update_funcs(map)
641660
exclude[root] = true
642661
local i = 1
643662
while true do
644-
local name, v = debug.getupvalue(root, i)
663+
local name, v = getupvalue(root, i)
645664
if name == nil then
646665
break
647666
else
648667
update_funcs_(v)
649668
if map[v] then
650-
debug.setupvalue(root, i, map[v])
669+
setupvalue(root, i, map[v])
651670
end
652671
end
653672
i=i+1
654673
end
655674
end
656-
local mt = debug.getmetatable(root)
657-
if mt then
658-
update_funcs_(mt)
659-
end
675+
end
676+
677+
-- nil, number, boolean, string, thread, function, lightuserdata may have metatable
678+
for _,v in pairs { nil, 0, true, "", co, update_funcs, debug.upvalueid(update_funcs,1) } do
679+
local mt = getmetatable(v)
680+
if mt then update_funcs_(mt) end
660681
end
661682

662683
update_funcs_frame(co, 2)

0 commit comments

Comments
 (0)