mirror of
https://github.com/minetest-mods/mesecons.git
synced 2024-11-05 06:53:44 +01:00
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)
|
local code_prohibited = function(code)
|
||||||
-- Clean code
|
-- Clean code
|
||||||
local prohibited = {"while", "for", "repeat", "until", "function"}
|
local prohibited = {"while", "for", "repeat", "until", "function", "goto"}
|
||||||
for _, p in ipairs(prohibited) do
|
for _, p in ipairs(prohibited) do
|
||||||
if string.find(code, p) then
|
if string.find(code, p) then
|
||||||
return "Prohibited command: "..p
|
return "Prohibited command: "..p
|
||||||
@ -139,13 +139,18 @@ local safe_print = function(param)
|
|||||||
print(dump(param))
|
print(dump(param))
|
||||||
end
|
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
|
if type(original) == 'table' then --nested table
|
||||||
local copy = {}
|
local copy = {}
|
||||||
|
visited[original] = copy
|
||||||
for key, value in next, original, nil do
|
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
|
end
|
||||||
setmetatable(copy, deep_copy(getmetatable(original)))
|
setmetatable(copy, deep_copy(getmetatable(original), visited))
|
||||||
return copy
|
return copy
|
||||||
elseif type(original) == 'function' then --ignore functions
|
elseif type(original) == 'function' then --ignore functions
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
Reference in New Issue
Block a user