Skip to content

Commit

Permalink
LFS lua example Lua 5.3 compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
vsky committed Aug 30, 2020
1 parent b4c148e commit 74b1776
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 45 deletions.
2 changes: 1 addition & 1 deletion app/include/user_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
// LUA_FLASH_STORE defines the default partition size if the NodeMCU partition
// tool is not used.

//#define LUA_FLASH_STORE 0x10000
#define LUA_FLASH_STORE 0x10000

// By default Lua executes the file init.lua at start up. The following
// define allows you to replace this with an alternative startup. Warning:
Expand Down
83 changes: 40 additions & 43 deletions lua_examples/lfs/_init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -24,36 +24,44 @@
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 = {
__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,

__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)
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,

__newindex = function(_, name, value) -- luacheck: no unused
error("LFS is readonly. Invalid write to LFS." .. name, 2)
end,
}

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
Expand All @@ -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
Expand All @@ -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


13 changes: 12 additions & 1 deletion tools/luacheck_config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}
},
Expand Down Expand Up @@ -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
}
}

Expand Down

0 comments on commit 74b1776

Please sign in to comment.