buldthensnip/pkg/base/lib_cside.lua
2015-10-04 13:24:07 +13:00

160 lines
3.0 KiB
Lua

--[[
This file is part of Ice Lua Components.
Ice Lua Components is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Lua Components is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with Ice Lua Components. If not, see <http://www.gnu.org/licenses/>.
]]
-- Create the table for clientside code
_CSIDE_G = {}
_CSIDE_G._G = _CSIDE_G
_CSIDE_G.hooks = {}
local builtins_main = {
"_VERSION",
"assert",
"collectgarbage",
"dofile",
"error",
"getfenv",
"getmetatable",
"ipairs",
"load",
"loadfile",
"loadstring",
"module",
"next",
"pairs",
"pcall",
"print",
"rawequal",
"rawget",
"rawset",
"require",
"select",
"setfenv",
"setmetatable",
"tonumber",
"tostring",
"type",
"unpack",
"xpcall",
}
-- Deep-copy a few builtins
do
local k,v
for k,v in pairs(builtins_main) do
_CSIDE_G[v] = _G[v]
end
_CSIDE_G.coroutine = {}
for k,v in pairs(coroutine) do
_CSIDE_G.coroutine[k] = v
end
_CSIDE_G.math = {}
for k,v in pairs(math) do
_CSIDE_G.math[k] = v
end
_CSIDE_G.string = {}
for k,v in pairs(string) do
_CSIDE_G.string[k] = v
end
_CSIDE_G.table = {}
for k,v in pairs(table) do
_CSIDE_G.table[k] = v
end
end
-- Wrap the loaders
do
-- TODO ensure that load is secure!
local s_load = load
function _CSIDE_G.load(...)
local ret = {s_load(...)}
if ret[1] ~= nil then
setfenv(ret[1], _CSIDE_G)
end
return unpack(ret)
end
local s_loadstring = loadstring
function _CSIDE_G.loadstring(...)
local ret = {s_loadstring(...)}
if ret[1] ~= nil then
setfenv(ret[1], _CSIDE_G)
end
return unpack(ret)
end
local s_loadfile = loadfile
function _CSIDE_G.loadfile(fname, ...)
-- XXX: do we attempt any pathname checks?
local ret = {s_loadfile(fname, ...)}
if ret[1] ~= nil then
setfenv(ret[1], _CSIDE_G)
end
return unpack(ret)
end
function _CSIDE_G.dofile(fname)
local ret, ret2 = s_loadfile(fname)
assert(ret, ret2)
setfenv(ret[1], _CSIDE_G)
ret()
end
end
-- Wrap getfenv
do
local s_getfenv = getfenv
function _CSIDE_G.getfenv(f)
local ret = s_getfenv(f)
if ret == _G then
ret = _CSIDE_G
end
return ret
end
end
-- Load the file
do
print("Attempting to load clientside VM function")
local err = {pcall(function()
local err
cside_vm_func, err = _CSIDE_G.loadfile("clsave/pub/vm/main.lua")
if not cside_vm_func then
print("Failed:", err)
else
print("Success, now running")
print("Result:", cside_vm_func()) -- if your hook is broken, this should crash on error
end
end)}
if (not err[1]) then
print("Failed to fetch:", unpack(err))
end
end