LFS lua example Lua 5.3 compatibility

This commit is contained in:
vsky 2020-06-18 21:42:13 +02:00 committed by Nathaniel Wesley Filardo
parent ba611101e5
commit a0d27059bc
2 changed files with 50 additions and 42 deletions

View File

@ -8,10 +8,10 @@
module related initialisaion in this. This example uses standard Lua features to
simplify the LFS API.
The first section adds a 'LFS' table to _G and uses the __index metamethod to
resolve functions in the LFS, so you can execute the main function of module
'fred' by executing LFS.fred(params), etc. It also implements some standard
readonly properties:
For Lua 5.1, the first section adds a 'LFS' table to _G and uses the __index
metamethod to resolve functions in the LFS, so you can execute the main
function of module 'fred' by executing LFS.fred(params), etc.
It also implements some standard readonly properties:
LFS._time The Unix Timestamp when the luac.cross was executed. This can be
used as a version identifier.
@ -24,11 +24,15 @@
print(table.concat(LFS._list,'\n'))
gives you a single column listing of all modules in the LFS.
For Lua 5.3 LFS table is populated by the LFS implementation in C so this part
of the code is skipped.
---------------------------------------------------------------------------------]]
local index = node.flashindex
local lfs_t = {
local G=_ENV or getfenv()
local lfs_t
if _VERSION == 'Lua 5.1' then
lfs_t = {
__index = function(_, name)
local fn_ut, ba, ma, size, modules = index(name)
if not ba then
@ -49,11 +53,15 @@ local lfs_t = {
__newindex = function(_, name, value) -- luacheck: no unused
error("LFS is readonly. Invalid write to LFS." .. name, 2)
end,
}
local G=getfenv()
G.LFS = setmetatable(lfs_t,lfs_t)
setmetatable(lfs_t,lfs_t)
G.module = nil -- disable Lua 5.0 style modules to save RAM
package.seeall = nil
else
lfs_t = node.LFS
end
G.LFS = lfs_t
--[[-------------------------------------------------------------------------------
The second section adds the LFS to the require searchlist, so that you can
@ -67,18 +75,9 @@ G.LFS = setmetatable(lfs_t,lfs_t)
---------------------------------------------------------------------------------]]
package.loaders[3] = function(module) -- loader_flash
local fn, ba = index(module)
return ba and "Module not in LFS" or fn
return lfs_t[module]
end
--[[-------------------------------------------------------------------------------
You can add any other initialisation here, for example a couple of the globals
are never used, so setting them to nil saves a couple of global entries
---------------------------------------------------------------------------------]]
G.module = nil -- disable Lua 5.0 style modules to save RAM
package.seeall = nil
--[[-------------------------------------------------------------------------------
These replaces the builtins loadfile & dofile with ones which preferentially
loads the corresponding module from LFS if present. Flipping the search order
@ -97,5 +96,3 @@ G.dofile = function(n)
local fn, ba = index(mod)
if ba or (ext ~= 'lc' and ext ~= 'lua') then return df(n) else return fn() end
end

View File

@ -430,6 +430,16 @@ stds.nodemcu_libs = {
MEDIUM_PRIORITY = empty,
HIGH_PRIORITY = empty
}
},
LFS = {
read_only = true,
fields = {
config = empty,
get = empty,
list = empty,
reload = empty,
time = empty
}
}
}
},
@ -919,7 +929,8 @@ stds.nodemcu_libs = {
pack = empty,
unpack = empty,
size = empty,
package = {fields = {seeall = read_write}}
package = {fields = {seeall = read_write}},
_ENV = empty
}
}