Support cyclic references in luacontroller memory tables, prohibit usage of goto statement (bugs reported by Nore).

This commit is contained in:
Anthony Zhang 2013-06-10 16:40:34 -04:00
parent 8ea71a9036
commit c87bc60635

View File

@ -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