diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/defs.js | 21 | ||||
-rw-r--r-- | src/fengaricore.js | 2 | ||||
-rw-r--r-- | src/lauxlib.js | 23 | ||||
-rw-r--r-- | src/liolib.js | 7 | ||||
-rw-r--r-- | src/loadlib.js | 2 | ||||
-rw-r--r-- | src/loslib.js | 14 | ||||
-rw-r--r-- | src/luaconf.js | 11 |
7 files changed, 49 insertions, 31 deletions
diff --git a/src/defs.js b/src/defs.js index 98269ea..daa5f70 100644 --- a/src/defs.js +++ b/src/defs.js @@ -56,6 +56,7 @@ const luastring_eq = function(a, b) { return true; }; +const unicode_error_message = "cannot convert invalid utf8 to javascript string"; const to_jsstring = function(value, from, to, replacement_char) { if (!is_luastring(value)) throw new TypeError("to_jsstring expects a Uint8Array"); @@ -72,18 +73,18 @@ const to_jsstring = function(value, from, to, replacement_char) { /* single byte sequence */ str += String.fromCharCode(u0); } else if (u0 < 0xC2 || u0 > 0xF4) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; } else if (u0 <= 0xDF) { /* two byte sequence */ if (i >= to) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } let u1 = value[i++]; if ((u1&0xC0) !== 0x80) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } @@ -91,19 +92,19 @@ const to_jsstring = function(value, from, to, replacement_char) { } else if (u0 <= 0xEF) { /* three byte sequence */ if (i+1 >= to) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } let u1 = value[i++]; if ((u1&0xC0) !== 0x80) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } let u2 = value[i++]; if ((u2&0xC0) !== 0x80) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } @@ -119,25 +120,25 @@ const to_jsstring = function(value, from, to, replacement_char) { } else { /* four byte sequence */ if (i+2 >= to) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } let u1 = value[i++]; if ((u1&0xC0) !== 0x80) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } let u2 = value[i++]; if ((u2&0xC0) !== 0x80) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } let u3 = value[i++]; if ((u3&0xC0) !== 0x80) { - if (!replacement_char) throw RangeError("cannot convert invalid utf8 to javascript string"); + if (!replacement_char) throw RangeError(unicode_error_message); str += "�"; continue; } diff --git a/src/fengaricore.js b/src/fengaricore.js index c34b560..1335ba8 100644 --- a/src/fengaricore.js +++ b/src/fengaricore.js @@ -11,7 +11,7 @@ const defs = require("./defs.js"); const FENGARI_VERSION_MAJOR = "0"; const FENGARI_VERSION_MINOR = "1"; const FENGARI_VERSION_NUM = 1; -const FENGARI_VERSION_RELEASE = "0"; +const FENGARI_VERSION_RELEASE = "1"; const FENGARI_VERSION = "Fengari " + FENGARI_VERSION_MAJOR + "." + FENGARI_VERSION_MINOR; const FENGARI_RELEASE = FENGARI_VERSION + "." + FENGARI_VERSION_RELEASE; const FENGARI_AUTHORS = "B. Giannangeli, Daurnimator"; diff --git a/src/lauxlib.js b/src/lauxlib.js index d575e99..2276bd0 100644 --- a/src/lauxlib.js +++ b/src/lauxlib.js @@ -290,11 +290,19 @@ const luaL_fileresult = function(L, stat, fname, e) { return 1; } else { lua_pushnil(L); + let message, errno; + if (e) { + message = e.message; + errno = -e.errno; + } else { + message = "Success"; /* what strerror(0) returns */ + errno = 0; + } if (fname) - lua_pushfstring(L, to_luastring("%s: %s"), fname, to_luastring(e.message)); + lua_pushfstring(L, to_luastring("%s: %s"), fname, to_luastring(message)); else - lua_pushstring(L, to_luastring(e.message)); - lua_pushinteger(L, -e.errno); + lua_pushstring(L, to_luastring(message)); + lua_pushinteger(L, errno); return 3; } }; @@ -850,8 +858,9 @@ if (typeof process === "undefined") { let path = to_uristring(filename); let xhr = new XMLHttpRequest(); xhr.open("GET", path, false); - /* XXX: Synchronous xhr in main thread always returns a js string - Additionally, some browsers make console noise if you even attempt to set responseType + /* + Synchronous xhr in main thread always returns a js string. + Some browsers make console noise if you even attempt to set responseType */ if (typeof window === "undefined") { xhr.responseType = "arraybuffer"; @@ -871,7 +880,7 @@ if (typeof process === "undefined") { let com = skipcomment(lf); /* check for signature first, as we don't want to add line number corrections in binary case */ if (com.c === LUA_SIGNATURE[0] && filename) { /* binary file? */ - /* no need to re-open in node.js */ + /* no need to re-open */ } else if (com.skipped) { /* read initial portion */ lf.buff[lf.n++] = 10 /* '\n'.charCodeAt(0) */; /* add line to correct line numbers */ } @@ -949,7 +958,7 @@ if (typeof process === "undefined") { let com = skipcomment(lf); /* check for signature first, as we don't want to add line number corrections in binary case */ if (com.c === LUA_SIGNATURE[0] && filename) { /* binary file? */ - /* no need to re-open in node.js */ + /* no need to re-open */ } else if (com.skipped) { /* read initial portion */ lf.buff[lf.n++] = 10 /* '\n'.charCodeAt(0) */; /* add line to correct line numbers */ } diff --git a/src/liolib.js b/src/liolib.js index bd78f87..92dda58 100644 --- a/src/liolib.js +++ b/src/liolib.js @@ -130,6 +130,11 @@ const io_output = function(L) { return g_iofile(L, IO_OUTPUT, "w"); }; +/* node <= 6 doesn't support passing a Uint8Array to fs.writeSync */ +const prepare_string_for_write = process.versions.node > 6 ? + (s) => s : // identity function + (s) => Buffer.from(s.buffer, s.byteOffset, s.byteLength); + const g_write = function(L, f, arg) { let nargs = lua_gettop(L) - arg; let status = true; @@ -137,7 +142,7 @@ const g_write = function(L, f, arg) { for (; nargs--; arg++) { let s = luaL_checklstring(L, arg); try { - status = status && (fs.writeSync(f.fd, Uint8Array.from(s)) === s.length); + status = status && (fs.writeSync(f.fd, prepare_string_for_write(s), 0, s.length) === s.length); } catch (e) { status = false; err = e; diff --git a/src/loadlib.js b/src/loadlib.js index f6679ba..49cfc5a 100644 --- a/src/loadlib.js +++ b/src/loadlib.js @@ -85,7 +85,7 @@ const global_env = (function() { return self; } else { /* unknown global env */ - return eval('this'); /* use non-strict mode to get global env */ + return (0, eval)('this'); /* use non-strict mode to get global env */ } })(); diff --git a/src/loslib.js b/src/loslib.js index 6fec903..6c6b2f4 100644 --- a/src/loslib.js +++ b/src/loslib.js @@ -251,13 +251,17 @@ if (typeof process === "undefined") { syslib.remove = function(L) { let filename = luaL_checkstring(L, 1); try { - if (fs.lstatSync(filename).isDirectory()) { - fs.rmdirSync(filename); + fs.unlinkSync(filename); + } catch (e) { + if (e.code === 'EISDIR') { + try { + fs.rmdirSync(filename); + } catch (e) { + return luaL_fileresult(L, false, filename, e); + } } else { - fs.unlinkSync(filename); + return luaL_fileresult(L, false, filename, e); } - } catch (e) { - return luaL_fileresult(L, false, filename, e); } return luaL_fileresult(L, true); }; diff --git a/src/luaconf.js b/src/luaconf.js index 7a6fe40..387e813 100644 --- a/src/luaconf.js +++ b/src/luaconf.js @@ -43,12 +43,12 @@ if (typeof process === "undefined") { const LUA_LDIR = "./lua/" + LUA_VDIR + "/"; module.exports.LUA_LDIR = LUA_LDIR; - const LUA_JSDIR = "./lua/" + LUA_VDIR + "/"; + const LUA_JSDIR = LUA_LDIR; module.exports.LUA_JSDIR = LUA_JSDIR; const LUA_PATH_DEFAULT = to_luastring( LUA_LDIR + "?.lua;" + LUA_LDIR + "?/init.lua;" + - LUA_JSDIR + "?.lua;" + LUA_JSDIR + "?/init.lua;" + + /* LUA_JSDIR excluded as it is equal to LUA_LDIR */ "./?.lua;./?/init.lua" ); module.exports.LUA_PATH_DEFAULT = LUA_PATH_DEFAULT; @@ -100,15 +100,14 @@ if (typeof process === "undefined") { const LUA_LDIR2 = LUA_ROOT2 + "share/lua/" + LUA_VDIR + "/"; module.exports.LUA_LDIR = LUA_LDIR; - const LUA_JSDIR = LUA_ROOT + "share/lua/" + LUA_VDIR + "/"; + const LUA_JSDIR = LUA_LDIR; module.exports.LUA_JSDIR = LUA_JSDIR; - const LUA_JSDIR2 = LUA_ROOT2 + "share/lua/" + LUA_VDIR + "/"; + const LUA_JSDIR2 = LUA_LDIR2; const LUA_PATH_DEFAULT = to_luastring( LUA_LDIR + "?.lua;" + LUA_LDIR + "?/init.lua;" + LUA_LDIR2 + "?.lua;" + LUA_LDIR2 + "?/init.lua;" + - LUA_JSDIR + "?.lua;" + LUA_JSDIR + "?/init.lua;" + - LUA_JSDIR2 + "?.lua;" + LUA_JSDIR2 + "?/init.lua;" + + /* LUA_JSDIR(2) excluded as it is equal to LUA_LDIR(2) */ "./?.lua;./?/init.lua" ); module.exports.LUA_PATH_DEFAULT = LUA_PATH_DEFAULT; |