forked from minetest-mods/mesecons
Support cyclic references in luacontroller memory tables, prohibit usage of goto statement (bugs reported by Nore).
This commit is contained in:
parent
8ea71a9036
commit
c87bc60635
@ -127,7 +127,7 @@ end
|
||||
|
||||
local code_prohibited = function(code)
|
||||
-- Clean code
|
||||
local prohibited = {"while", "for", "repeat", "until", "function"}
|
||||
local prohibited = {"while", "for", "repeat", "until", "function", "goto"}
|
||||
for _, p in ipairs(prohibited) do
|
||||
if string.find(code, p) then
|
||||
return "Prohibited command: "..p
|
||||
@ -139,13 +139,18 @@ local safe_print = function(param)
|
||||
print(dump(param))
|
||||
end
|
||||
|
||||
deep_copy = function(original) --deep copy that removes functions
|
||||
deep_copy = function(original, visited) --deep copy that removes functions
|
||||
visited = visited or {}
|
||||
if visited[original] ~= nil then --already visited this node
|
||||
return visited[original]
|
||||
end
|
||||
if type(original) == 'table' then --nested table
|
||||
local copy = {}
|
||||
visited[original] = copy
|
||||
for key, value in next, original, nil do
|
||||
copy[deep_copy(key)] = deep_copy(value)
|
||||
copy[deep_copy(key, visited)] = deep_copy(value, visited)
|
||||
end
|
||||
setmetatable(copy, deep_copy(getmetatable(original)))
|
||||
setmetatable(copy, deep_copy(getmetatable(original), visited))
|
||||
return copy
|
||||
elseif type(original) == 'function' then --ignore functions
|
||||
return nil
|
||||
|
Loading…
Reference in New Issue
Block a user