Merge pull request #213 from nodemcu/cross

add node.compile() api
This commit is contained in:
zeroday 2015-02-13 15:15:51 +08:00
commit 7e524f7dd4
7 changed files with 98 additions and 5 deletions

View File

@ -28,6 +28,13 @@ Tencent QQ group: 309957875<br />
- cross compiler - cross compiler
# Change log # Change log
2015-02-13<br />
add node.compile() api to compile lua text file into lua bytecode file.<br />
this will reduce memory usage noticeably when require modules into NodeMCU.<br />
raise internal LUA_BUFFERSIZE from 1024 to 4096.<br />
lua require("mod") will load "mod.lc" file first if exist.<br />
build latest pre_build bin.
2015-02-12<br /> 2015-02-12<br />
fix float print.<br /> fix float print.<br />
update spiffs, add file.rename api to file module.<br /> update spiffs, add file.rename api to file module.<br />
@ -297,6 +304,7 @@ cu:send("hello")
####Use DS18B20 module extends your esp8266 ####Use DS18B20 module extends your esp8266
```lua ```lua
-- read temperature with DS18B20 -- read temperature with DS18B20
node.compile("ds18b20.lua") -- run this only once to compile and save to "ds18b20.lc"
t=require("ds18b20") t=require("ds18b20")
t.setup(9) t.setup(9)
addrs=t.addrs() addrs=t.addrs()

View File

@ -7,7 +7,7 @@
#define NODE_VERSION_INTERNAL 0U #define NODE_VERSION_INTERNAL 0U
#define NODE_VERSION "NodeMCU 0.9.5" #define NODE_VERSION "NodeMCU 0.9.5"
#define BUILD_DATE "build 20150212" #define BUILD_DATE "build 20150213"
// #define DEVKIT_VERSION_0_9 1 // define this only if you use NodeMCU devkit v0.9 // #define DEVKIT_VERSION_0_9 1 // define this only if you use NodeMCU devkit v0.9

View File

@ -108,7 +108,7 @@
#define LUA_CDIR LUA_ROOT "lib/lua/5.1/" #define LUA_CDIR LUA_ROOT "lib/lua/5.1/"
#ifndef LUA_RPC #ifndef LUA_RPC
#define LUA_PATH_DEFAULT "?.lua;?.lc" #define LUA_PATH_DEFAULT "?.lc;?.lua"
#define LUA_CPATH_DEFAULT "" #define LUA_CPATH_DEFAULT ""
#else // #ifndef LUA_RPC #else // #ifndef LUA_RPC
#define LUA_PATH_DEFAULT \ #define LUA_PATH_DEFAULT \
@ -542,7 +542,7 @@ extern int readline4lua(const char *prompt, char *buffer, int length);
/* /*
@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. @@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.
*/ */
#define LUAL_BUFFERSIZE BUFSIZ #define LUAL_BUFFERSIZE (BUFSIZ*4)
/* }================================================================== */ /* }================================================================== */

View File

@ -1,8 +1,16 @@
// Module for interfacing with system // Module for interfacing with system
//#include "lua.h" #include "lua.h"
#include "lualib.h"
#include "lauxlib.h" #include "lauxlib.h"
#include "ldo.h"
#include "lfunc.h"
#include "lmem.h"
#include "lobject.h"
#include "lopcodes.h"
#include "lstring.h"
#include "lundump.h"
#include "platform.h" #include "platform.h"
#include "auxmods.h" #include "auxmods.h"
#include "lrotable.h" #include "lrotable.h"
@ -14,6 +22,7 @@
//#include "spi_flash.h" //#include "spi_flash.h"
#include "user_interface.h" #include "user_interface.h"
#include "flash_api.h" #include "flash_api.h"
#include "flash_fs.h"
// Lua: restart() // Lua: restart()
static int node_restart( lua_State* L ) static int node_restart( lua_State* L )
@ -311,6 +320,73 @@ static int node_output( lua_State* L )
return 0; return 0;
} }
static int writer(lua_State* L, const void* p, size_t size, void* u)
{
UNUSED(L);
int file_fd = *( (int *)u );
if((FS_OPEN_OK - 1)==file_fd)
return 1;
NODE_DBG("get fd:%d,size:%d\n",file_fd,size);
if(size!=0 && (size!=fs_write(file_fd, (const char *)p, size)) )
return 1;
NODE_DBG("write fd:%d,size:%d\n",file_fd,size);
return 0;
}
#define toproto(L,i) (clvalue(L->top+(i))->l.p)
// Lua: compile(filename) -- compile lua file into lua bytecode, and save to .lc
static int node_compile( lua_State* L )
{
Proto* f;
int file_fd = FS_OPEN_OK - 1;
size_t len;
const char *fname = luaL_checklstring( L, 1, &len );
if( len > FS_NAME_MAX_LENGTH )
return luaL_error(L, "filename too long");
char output[FS_NAME_MAX_LENGTH];
c_strcpy(output, fname);
// check here that filename end with ".lua".
if(len<4 || (c_strcmp( output+len-4,".lua")!=0) )
return luaL_error(L, "not a .lua file");
output[c_strlen(output)-2] = 'c';
output[c_strlen(output)-1] = '\0';
NODE_DBG(output);
NODE_DBG("\n");
if (luaL_loadfsfile(L,fname)!=0){
return luaL_error(L, lua_tostring(L,-1));
}
f = toproto(L,-1);
int stripping = 1; /* strip debug information? */
file_fd = fs_open(output, fs_mode2flag("w+"));
if(file_fd < FS_OPEN_OK)
{
return luaL_error(L, "cannot open/write to file");
}
lua_lock(L);
int result=luaU_dump(L,f,writer,&file_fd,stripping);
lua_unlock(L);
fs_flush(file_fd);
fs_close(file_fd);
file_fd = FS_OPEN_OK - 1;
if (result==LUA_ERR_CC_INTOVERFLOW){
return luaL_error(L, "value too big or small for target integer type");
}
if (result==LUA_ERR_CC_NOTINTEGER){
return luaL_error(L, "target lua_Number is integral but fractional value found");
}
return 0;
}
// Module function map // Module function map
#define MIN_OPT_LEVEL 2 #define MIN_OPT_LEVEL 2
#include "lrodefs.h" #include "lrodefs.h"
@ -330,6 +406,7 @@ const LUA_REG_TYPE node_map[] =
{ LSTRKEY( "input" ), LFUNCVAL( node_input ) }, { LSTRKEY( "input" ), LFUNCVAL( node_input ) },
{ LSTRKEY( "output" ), LFUNCVAL( node_output ) }, { LSTRKEY( "output" ), LFUNCVAL( node_output ) },
{ LSTRKEY( "readvdd33" ), LFUNCVAL( node_readvdd33) }, { LSTRKEY( "readvdd33" ), LFUNCVAL( node_readvdd33) },
{ LSTRKEY( "compile" ), LFUNCVAL( node_compile) },
// Combined to dsleep(us, option) // Combined to dsleep(us, option)
// { LSTRKEY( "dsleepsetoption" ), LFUNCVAL( node_deepsleep_setoption) }, // { LSTRKEY( "dsleepsetoption" ), LFUNCVAL( node_deepsleep_setoption) },
#if LUA_OPTIMIZE_MEMORY > 0 #if LUA_OPTIMIZE_MEMORY > 0

View File

@ -339,3 +339,11 @@ uart.on("data",4, function(data)
end end
end, 0) end, 0)
file.open("hello.lua","w+")
file.writeline([[print("hello nodemcu")]])
file.writeline([[print(node.heap())]])
file.close()
node.compile("hello.lua")
dofile("hello.lua")
dofile("hello.lc")

Binary file not shown.

Binary file not shown.