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 module related initialisaion in this. This example uses standard Lua features to
simplify the LFS API. simplify the LFS API.
The first section adds a 'LFS' table to _G and uses the __index metamethod to For Lua 5.1, the first section adds a 'LFS' table to _G and uses the __index
resolve functions in the LFS, so you can execute the main function of module metamethod to resolve functions in the LFS, so you can execute the main
'fred' by executing LFS.fred(params), etc. It also implements some standard function of module 'fred' by executing LFS.fred(params), etc.
readonly properties: It also implements some standard readonly properties:
LFS._time The Unix Timestamp when the luac.cross was executed. This can be LFS._time The Unix Timestamp when the luac.cross was executed. This can be
used as a version identifier. used as a version identifier.
@ -24,36 +24,44 @@
print(table.concat(LFS._list,'\n')) print(table.concat(LFS._list,'\n'))
gives you a single column listing of all modules in the LFS. 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 index = node.flashindex
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
return fn_ut
elseif name == '_time' then
return fn_ut
elseif name == '_config' then
local fs_ma, fs_size = file.fscfg()
return {lfs_base = ba, lfs_mapped = ma, lfs_size = size,
fs_mapped = fs_ma, fs_size = fs_size}
elseif name == '_list' then
return modules
else
return nil
end
end,
local lfs_t = { __newindex = function(_, name, value) -- luacheck: no unused
__index = function(_, name) error("LFS is readonly. Invalid write to LFS." .. name, 2)
local fn_ut, ba, ma, size, modules = index(name) end,
if not ba then }
return fn_ut
elseif name == '_time' then
return fn_ut
elseif name == '_config' then
local fs_ma, fs_size = file.fscfg()
return {lfs_base = ba, lfs_mapped = ma, lfs_size = size,
fs_mapped = fs_ma, fs_size = fs_size}
elseif name == '_list' then
return modules
else
return nil
end
end,
__newindex = function(_, name, value) -- luacheck: no unused setmetatable(lfs_t,lfs_t)
error("LFS is readonly. Invalid write to LFS." .. name, 2) G.module = nil -- disable Lua 5.0 style modules to save RAM
end, package.seeall = nil
else
} lfs_t = node.LFS
end
local G=getfenv() G.LFS = lfs_t
G.LFS = setmetatable(lfs_t,lfs_t)
--[[------------------------------------------------------------------------------- --[[-------------------------------------------------------------------------------
The second section adds the LFS to the require searchlist, so that you can 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 package.loaders[3] = function(module) -- loader_flash
local fn, ba = index(module) return lfs_t[module]
return ba and "Module not in LFS" or fn
end 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 These replaces the builtins loadfile & dofile with ones which preferentially
loads the corresponding module from LFS if present. Flipping the search order 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) local fn, ba = index(mod)
if ba or (ext ~= 'lc' and ext ~= 'lua') then return df(n) else return fn() end if ba or (ext ~= 'lc' and ext ~= 'lua') then return df(n) else return fn() end
end end

View File

@ -430,6 +430,16 @@ stds.nodemcu_libs = {
MEDIUM_PRIORITY = empty, MEDIUM_PRIORITY = empty,
HIGH_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, pack = empty,
unpack = empty, unpack = empty,
size = empty, size = empty,
package = {fields = {seeall = read_write}} package = {fields = {seeall = read_write}},
_ENV = empty
} }
} }