74 lines
1.9 KiB
Plaintext
74 lines
1.9 KiB
Plaintext
--:Minify:--
|
|
local args = {...}
|
|
local kernel = args[1]
|
|
kernel._G = _G
|
|
|
|
|
|
local function readonly(tbl)
|
|
return setmetatable({}, {
|
|
__index = function(_, key)
|
|
local value = tbl[key]
|
|
if type(value) == "table" then return readonly(value) end
|
|
return value
|
|
end,
|
|
|
|
__newindex = function(t, k, v)
|
|
if kernel.config.allowGlobalOverwrites or
|
|
kernel.allowGlobalOverwrites then
|
|
rawset(tbl, k, v)
|
|
return
|
|
end
|
|
error("Attempt to modify global variable '" .. k .. "'", 2)
|
|
end,
|
|
|
|
__pairs = function(self)
|
|
local function iter(_, key)
|
|
local nextKey, value = next(tbl, key)
|
|
if type(value) == "table" then
|
|
value = readonly(value)
|
|
end
|
|
return nextKey, value
|
|
end
|
|
return iter, self, nil
|
|
end,
|
|
|
|
__ipairs = function()
|
|
local i = 0
|
|
return function()
|
|
i = i + 1
|
|
local value = tbl[i]
|
|
if value == nil then return end
|
|
if type(value) == "table" then
|
|
value = readonly(value)
|
|
end
|
|
return i, value
|
|
end
|
|
end,
|
|
|
|
__len = function() return #tbl end,
|
|
|
|
__metatable = false
|
|
})
|
|
end
|
|
local origLoad = load
|
|
|
|
kernel._U = readonly(kernel._G)
|
|
kernel._U._G = kernel._U
|
|
kernel._U.load = function(a,b,c,d) return origLoad(a,b,c,d or kernel._U) end
|
|
|
|
function kernel.freshUserEnv()
|
|
local locals = {}
|
|
locals.syscall = _makeSyscallProxy()
|
|
|
|
local env = setmetatable(locals, {
|
|
__index = kernel._U,
|
|
__newindex = function(_, k, v) rawset(locals, k, v) end,
|
|
__metatable=false
|
|
})
|
|
|
|
locals._G = env
|
|
locals.load = function(a, b, c, d) return origLoad(a, b, c, d or env) end
|
|
|
|
return env
|
|
end
|