Merge 91e3b13d5a
into cffbc33e6d
This commit is contained in:
commit
6e4d7f7150
|
@ -234,6 +234,24 @@ function mesecon.tablecopy(obj) -- deep copy
|
||||||
return obj
|
return obj
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Performs a deep copy of a table, changing the environment of any functions.
|
||||||
|
-- Adapted from the builtin table.copy() function.
|
||||||
|
function mesecon.tablecopy_change_env(t, env, seen)
|
||||||
|
local n = {}
|
||||||
|
seen = seen or {}
|
||||||
|
seen[t] = n
|
||||||
|
for k, v in pairs(t) do
|
||||||
|
if type(v) == "function" then
|
||||||
|
setfenv(v, env)
|
||||||
|
n[(type(k) == "table" and (seen[k] or mesecon.tablecopy_change_env(k, env, seen))) or k] = v
|
||||||
|
else
|
||||||
|
n[(type(k) == "table" and (seen[k] or mesecon.tablecopy_change_env(k, env, seen))) or k] =
|
||||||
|
(type(v) == "table" and (seen[v] or mesecon.tablecopy_change_env(v, env, seen))) or v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return n
|
||||||
|
end
|
||||||
|
|
||||||
-- Returns whether two values are equal.
|
-- Returns whether two values are equal.
|
||||||
-- In tables, keys are compared for identity but values are compared recursively.
|
-- In tables, keys are compared for identity but values are compared recursively.
|
||||||
-- There is no protection from infinite recursion.
|
-- There is no protection from infinite recursion.
|
||||||
|
|
|
@ -479,6 +479,24 @@ local function get_digiline_send(pos, itbl, send_warning)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Mods can place their own "libraries" in here to be loaded via require() from in a Luacontroller.
|
||||||
|
-- These can take two different forms:
|
||||||
|
-- Function (recommended for libraries adding new functionality): A function that, when called, returns something that will be passed to the LuaC code.
|
||||||
|
-- Function signature is getlibrary(env, pos) where 'env' is the environment that the Luacontroller code is running in, and 'pos' is the position of the controller.
|
||||||
|
-- Table (recommended for libraries containing mostly lookup tables): A table that will be copied, and the copy returned to the LuaC code.
|
||||||
|
-- When using the table format, any functions in the table will have their environment changed to that of the Luacontroller.
|
||||||
|
mesecon.luacontroller_libraries = {}
|
||||||
|
|
||||||
|
local function get_require(pos, env)
|
||||||
|
return function(name)
|
||||||
|
if type(mesecon.luacontroller_libraries[name]) == "function" then
|
||||||
|
return mesecon.luacontroller_libraries[name](env, pos)
|
||||||
|
elseif type(mesecon.luacontroller_libraries[name]) == "table" then
|
||||||
|
return mesecon.tablecopy_change_env(mesecon.luacontroller_libraries[name], env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local safe_globals = {
|
local safe_globals = {
|
||||||
-- Don't add pcall/xpcall unless willing to deal with the consequences (unless very careful, incredibly likely to allow killing server indirectly)
|
-- Don't add pcall/xpcall unless willing to deal with the consequences (unless very careful, incredibly likely to allow killing server indirectly)
|
||||||
"assert", "error", "ipairs", "next", "pairs", "select",
|
"assert", "error", "ipairs", "next", "pairs", "select",
|
||||||
|
@ -572,6 +590,8 @@ local function create_environment(pos, mem, event, itbl, send_warning)
|
||||||
for _, name in pairs(safe_globals) do
|
for _, name in pairs(safe_globals) do
|
||||||
env[name] = _G[name]
|
env[name] = _G[name]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
env.require = get_require(pos, env)
|
||||||
|
|
||||||
return env
|
return env
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue