summaryrefslogtreecommitdiff
path: root/mesecons_luacontroller
diff options
context:
space:
mode:
authorAnthony Zhang <azhang9@gmail.com>2013-06-10 16:40:34 -0400
committerAnthony Zhang <azhang9@gmail.com>2013-06-10 16:40:34 -0400
commitc87bc606358f8727d69bd39b5cacb31c582bb1af (patch)
treede0b959e5c23c9c1a8c0bd2ec00577599acdda3e /mesecons_luacontroller
parent8ea71a9036fb1070ea5478b91ecf26fc40b84e92 (diff)
downloadmesecons-c87bc606358f8727d69bd39b5cacb31c582bb1af.tar
mesecons-c87bc606358f8727d69bd39b5cacb31c582bb1af.tar.gz
mesecons-c87bc606358f8727d69bd39b5cacb31c582bb1af.tar.bz2
mesecons-c87bc606358f8727d69bd39b5cacb31c582bb1af.tar.xz
mesecons-c87bc606358f8727d69bd39b5cacb31c582bb1af.zip
Support cyclic references in luacontroller memory tables, prohibit usage of goto statement (bugs reported by Nore).
Diffstat (limited to 'mesecons_luacontroller')
-rw-r--r--mesecons_luacontroller/init.lua13
1 files changed, 9 insertions, 4 deletions
diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua
index 9fa995f..b99b6e4 100644
--- a/mesecons_luacontroller/init.lua
+++ b/mesecons_luacontroller/init.lua
@@ -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