From 7729b811e5d0523b3ad613284c8674876f0d8321 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Wed, 9 Aug 2017 08:44:52 +0200 Subject: loadfile and dofile are available in the browser --- README.md | 5 ----- src/lbaselib.js | 52 +++++++++++++++++++++++----------------------------- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 78ed892..ee6880f 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,6 @@ In the browser `require` and `package.loadlib` try to find a file by making sync - `lua_gc`/`collectgarbage`: Fengari relies on the JS garbage collector and does not implement its own. - The following functions are only available in Node: - - `luaL_dofile` - - `luaL_loadfilex` - - `luaL_loadfile` - - `loadfile` - - `dofile` - The entire `io` lib - `os.remove` - `os.rename` diff --git a/src/lbaselib.js b/src/lbaselib.js index b2a9951..6947f94 100644 --- a/src/lbaselib.js +++ b/src/lbaselib.js @@ -333,13 +333,36 @@ const luaB_load = function(L) { return load_aux(L, status, env); }; +const luaB_loadfile = function(L) { + let fname = lauxlib.luaL_optstring(L, 1, null); + let mode = lauxlib.luaL_optstring(L, 2, null); + let env = !lua.lua_isnone(L, 3) ? 3 : 0; /* 'env' index or 0 if no 'env' */ + let status = lauxlib.luaL_loadfilex(L, fname, mode); + return load_aux(L, status, env); +}; + +const dofilecont = function(L, d1, d2) { + return lua.lua_gettop(L) - 1; +}; + +const luaB_dofile = function(L) { + let fname = lauxlib.luaL_optstring(L, 1, null); + lua.lua_settop(L, 1); + if (lauxlib.luaL_loadfile(L, fname) !== lua.LUA_OK) + return lua.lua_error(L); + lua.lua_callk(L, 0, lua.LUA_MULTRET, 0, dofilecont); + return dofilecont(L, 0, 0); +}; + const base_funcs = { "assert": luaB_assert, "collectgarbage": luaB_collectgarbage, + "dofile": luaB_dofile, "error": luaB_error, "getmetatable": luaB_getmetatable, "ipairs": luaB_ipairs, "load": luaB_load, + "loadfile": luaB_loadfile, "next": luaB_next, "pairs": luaB_pairs, "pcall": luaB_pcall, @@ -356,35 +379,6 @@ const base_funcs = { "xpcall": luaB_xpcall }; -// Only with Node -if (!WEB) { - - const luaB_loadfile = function(L) { - let fname = lauxlib.luaL_optstring(L, 1, null); - let mode = lauxlib.luaL_optstring(L, 2, null); - let env = !lua.lua_isnone(L, 3) ? 3 : 0; /* 'env' index or 0 if no 'env' */ - let status = lauxlib.luaL_loadfilex(L, fname, mode); - return load_aux(L, status, env); - }; - - const dofilecont = function(L, d1, d2) { - return lua.lua_gettop(L) - 1; - }; - - const luaB_dofile = function(L) { - let fname = lauxlib.luaL_optstring(L, 1, null); - lua.lua_settop(L, 1); - if (lauxlib.luaL_loadfile(L, fname) !== lua.LUA_OK) - return lua.lua_error(L); - lua.lua_callk(L, 0, lua.LUA_MULTRET, 0, dofilecont); - return dofilecont(L, 0, 0); - }; - - base_funcs.loadfile = luaB_loadfile; - base_funcs.dofile = luaB_dofile; - -} - const luaopen_base = function(L) { /* open lib into global table */ lua.lua_pushglobaltable(L); -- cgit v1.2.3-70-g09d2