11local reload = {}
22local sandbox = {}
33
4+ local table = table
5+ local debug = debug
6+
47do -- sandbox begin
58
69local 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