From 166c71af52773521118b890b4ebebcce873132ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Wed, 12 Sep 2012 12:00:08 +0800 Subject: [PATCH] loadx --- lualib/config.lua | 2 ++ lualib/loadx.lua | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 lualib/loadx.lua diff --git a/lualib/config.lua b/lualib/config.lua index 6ec7b59f..bd80fdb2 100644 --- a/lualib/config.lua +++ b/lualib/config.lua @@ -1,3 +1,5 @@ +require "loadx" + local function config(path , pre) assert(path) local env = pre or {} diff --git a/lualib/loadx.lua b/lualib/loadx.lua new file mode 100644 index 00000000..87aa6fda --- /dev/null +++ b/lualib/loadx.lua @@ -0,0 +1,86 @@ +local cookie + +local function make_ld(ld) + local load_cookie + return function() + if load_cookie then + return ld() + else + load_cookie = true + return cookie + end + end +end + +if _VERSION == "Lua 5.2" then + +cookie = "local function __setenv() end;" + +local load = load + +function _G.load(ld, chunkname, mode, env) + local f + if type(ld) == "string" then + f = load(cookie .. ld, chunkname, mode, env) + else + f = load(make_ld(ld), chunkname) + end + + return f +end + +function _G.loadfile(filename, mode, env) + local f = io.open(filename, "rb") + assert(f, filename) + local source = f:read "*a" + f:close() + return _G.load(source, "@" .. filename, mode, env) +end + +_G.loadstring = _G.load + + return +end + +local assert = assert + +assert(_VERSION == "Lua 5.1") + +local setfenv = setfenv +local getfenv = getfenv +local loadstring = loadstring +local load = load +local io = io + +local function __setenv(env) + setfenv(2,env) +end + +cookie = "local _ENV,__setenv = __getenv();" + +function _G.load(ld, chunkname, mode, env) + local f + if type(ld) == "string" then + f = loadstring(cookie .. ld, chunkname) + else + f = load(make_ld(ld), chunkname) + end + env = env or getfenv(1) + setfenv(f, { __getenv = function() + setfenv(2, env) + return env, __setenv + end }) + + return f +end + +function _G.loadfile(filename, mode, env) + local f = io.open(filename, "rb") + assert(f, filename) + local source = f:read "*a" + f:close() + return _G.load(source, "@" .. filename, mode, env) +end + +_G.loadstring = _G.load +_G._ENV = _G