From 456ab7b69f88859683c60cc2261e70d6dbadd8e8 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Wed, 29 Mar 2017 14:39:57 +0200 Subject: 8-bit string internally tests Lexing/Parsing is done on byte rather than js strings --- src/lapi.js | 4 +- src/lauxlib.js | 11 ++--- src/lbaselib.js | 4 +- src/lcode.js | 2 +- src/ldebug.js | 4 +- src/ldo.js | 10 ++--- src/linit.js | 5 ++- src/llex.js | 113 +++++++++++++++++++++++++----------------------- src/lobject.js | 6 ++- src/lparser.js | 124 ++++++++++++++++++++++++++-------------------------- src/lstrlib.js | 2 +- src/ltablib.js | 2 +- src/ltm.js | 2 +- src/lua.js | 2 + src/lundump.js | 30 ++++++------- src/lutf8lib.js | 63 +++++++++++---------------- src/lvm.js | 16 +++---- tests/lapi.js | 90 +++++++++++++++++++------------------- tests/lbaselib.js | 68 ++++++++++++++--------------- tests/lcorolib.js | 16 +++---- tests/ldebug.js | 30 ++++++------- tests/lexparse.js | 127 +++++++++++++++++++++++++++--------------------------- tests/lmathlib.js | 32 +++++++------- tests/load.js | 12 +++--- tests/lstrlib.js | 71 +++++++++++++++--------------- tests/ltablib.js | 20 ++++----- tests/ltm.js | 55 +++++++++++------------ tests/lutf8lib.js | 6 +-- tests/lvm.js | 20 ++++----- 29 files changed, 476 insertions(+), 471 deletions(-) diff --git a/src/lapi.js b/src/lapi.js index 6e1471d..e7fbf4f 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -678,7 +678,7 @@ const lua_compare_ = function(L, o1, o2, op) { }; const lua_stringtonumber = function(L, s) { - let number = parseFloat(s); + let number = parseFloat(lobject.jsstring(s)); L.stack[L.top++] = new TValue(number % 1 !== 0 ? CT.LUA_TNUMFLT : CT.LUA_TNUMINT, number); assert(L.top <= L.ci.top, "stack overflow"); return s.length; @@ -980,6 +980,8 @@ module.exports.lua_toboolean = lua_toboolean; module.exports.lua_todataview = lua_todataview; module.exports.lua_tointeger = lua_tointeger; module.exports.lua_tointegerx = lua_tointegerx; +module.exports.lua_tojsstring = lua_tojsstring; +module.exports.lua_toljsstring = lua_toljsstring; module.exports.lua_tolstring = lua_tolstring; module.exports.lua_tonumber = lua_tonumber; module.exports.lua_topointer = lua_topointer; diff --git a/src/lauxlib.js b/src/lauxlib.js index f60bd8c..9813095 100644 --- a/src/lauxlib.js +++ b/src/lauxlib.js @@ -55,7 +55,7 @@ const findfield = function(L, objidx, level) { const pushglobalfuncname = function(L, ar) { let top = lapi.lua_gettop(L); ldebug.lua_getinfo(L, 'f', ar); /* push function */ - lapi.lua_getfield(L, lua.LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lapi.lua_getfield(L, lua.LUA_REGISTRYINDEX, lua.to_luastring(LUA_LOADED_TABLE)); if (findfield(L, top + 1, 2)) { let name = lapi.lua_tostring(L, -1); if (name.jsstring().startsWith("_G.")) { @@ -333,7 +333,7 @@ const luaL_tolstring = function(L, idx) { ** Leaves resulting module on the top. */ const luaL_requiref = function(L, modname, openf, glb) { - luaL_getsubtable(L, lua.LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + luaL_getsubtable(L, lua.LUA_REGISTRYINDEX, lua.to_luastring(LUA_LOADED_TABLE)); lapi.lua_getfield(L, -1, modname); /* LOADED[modname] */ if (!lapi.lua_toboolean(L, -1)) { /* package not already loaded? */ lapi.lua_pop(L, 1); /* remove field */ @@ -441,7 +441,7 @@ if (typeof require === "function") { lf.pos += bytes; } if (bytes > 0) - return lf.binary ? toDataView(lf.buff) : lf.buff; + return lf.binary ? toDataView(lf.buff) : lf.buff.slice(0, bytes); else return null; }; @@ -502,15 +502,16 @@ if (typeof require === "function") { }; const luaL_loadfilex = function(L, filename, mode) { + let jsfilename = lobject.jsstring(filename); let lf = new LoadF(); let fnameindex = lapi.lua_gettop(L) + 1; /* index of filename on the stack */ if (filename === null) { lapi.lua_pushliteral(L, "=stdin"); lf.f = process.stdin.fd; } else { - lapi.lua_pushliteral(L, `@${filename}`); + lapi.lua_pushliteral(L, `@${jsfilename}`); try { - lf.f = fs.openSync(filename, "r"); + lf.f = fs.openSync(jsfilename, "r"); } catch (e) { return errfile(L, lua.to_luastring("open"), fnameindex, e); } diff --git a/src/lbaselib.js b/src/lbaselib.js index 8420672..4d0fb9c 100644 --- a/src/lbaselib.js +++ b/src/lbaselib.js @@ -11,7 +11,7 @@ const TS = lua.thread_status; const luaB_print = function(L) { let n = lapi.lua_gettop(L); /* number of arguments */ - let str = ""; + let str = []; lapi.lua_getglobal(L, lua.to_luastring("tostring")); for (let i = 1; i <= n; i++) { @@ -201,7 +201,7 @@ const luaB_assert = function(L) { const luaB_select = function(L) { let n = lapi.lua_gettop(L); - if (lapi.lua_type(L, 1) === CT.LUA_TSTRING && lapi.lua_tostring(L, 1) === "#") { + if (lapi.lua_type(L, 1) === CT.LUA_TSTRING && lapi.lua_tostring(L, 1)[0] === "#".charCodeAt(0)) { lapi.lua_pushinteger(L, n - 1); return 1; } else { diff --git a/src/lcode.js b/src/lcode.js index 8b4a57c..752eedf 100644 --- a/src/lcode.js +++ b/src/lcode.js @@ -1231,7 +1231,7 @@ const luaK_setlist = function(fs, base, nelems, tostore) { codeextraarg(fs, c); } else - llex.luaX_syntaxerror(fs.ls, "constructor too long"); + llex.luaX_syntaxerror(fs.ls, lua.to_luastring("constructor too long")); fs.freereg = base + 1; /* free registers with list values */ }; diff --git a/src/ldebug.js b/src/ldebug.js index 507e764..0fba4cb 100644 --- a/src/ldebug.js +++ b/src/ldebug.js @@ -431,7 +431,7 @@ const varinfo = function(L, o) { kind = getobjname(ci.func.p, ci.pcOff, stkid - ci.u.l.base); } - return lua.to_luastring(kind ? ` (${lobject.jsstring(kind.funcname)} '${lobject.jsstring(kind.name)}')` : ``); + return lua.to_luastring(kind ? ` (${lobject.jsstring(kind.funcname)} '${kind.name.jsstring()}')` : ``); }; const luaG_typeerror = function(L, o, op) { @@ -457,7 +457,7 @@ const luaG_opinterror = function(L, p1, p2, msg) { const luaG_ordererror = function(L, p1, p2) { let t1 = ltm.luaT_objtypename(L, p1); let t2 = ltm.luaT_objtypename(L, p2); - if (t1 === t2) + if (t1.join() === t2.join()) luaG_runerror(L, lua.to_luastring(`attempt to compare two ${lobject.jsstring(t1)} values`)); else luaG_runerror(L, lua.to_luastring(`attempt to compare ${lobject.jsstring(t1)} with ${lobject.jsstring(t2)}`)); diff --git a/src/ldo.js b/src/ldo.js index 54d1ac0..6a74cad 100644 --- a/src/ldo.js +++ b/src/ldo.js @@ -519,8 +519,8 @@ class SParser { } const checkmode = function(L, mode, x) { - if (mode && mode.indexOf(x.charCodeAt(0)) === -1) { - lapi.lua_pushstring(L, lua.to_luastring(`attempt to load a ${lobject.jsstring(x)} chunk (mode is '${mode}')`)); + if (mode && mode.indexOf(x[0]) === -1) { + lapi.lua_pushstring(L, lua.to_luastring(`attempt to load a ${lobject.jsstring(x)} chunk (mode is '${lobject.jsstring(mode)}')`)); luaD_throw(L, TS.LUA_ERRSYNTAX); } }; @@ -528,11 +528,11 @@ const checkmode = function(L, mode, x) { const f_parser = function(L, p) { let cl; let c = p.z.getc(); /* read first character */ - if (String.fromCharCode(c) === lua.LUA_SIGNATURE.charAt(0)) { - checkmode(L, p.mode, "binary"); + if (c === lua.LUA_SIGNATURE.charCodeAt(0)) { + checkmode(L, p.mode, lua.to_luastring("binary")); cl = new BytecodeParser(L, p.z.buffer).luaU_undump(); } else { - checkmode(L, p.mode, "text"); + checkmode(L, p.mode, lua.to_luastring("text")); cl = lparser.luaY_parser(L, p.z, p.buff, p.dyd, p.name, c); } diff --git a/src/linit.js b/src/linit.js index 4d50f8b..3e9b1af 100644 --- a/src/linit.js +++ b/src/linit.js @@ -2,6 +2,7 @@ const assert = require('assert'); +const lua = require('./lua.js'); const lapi = require('./lapi.js'); const lauxlib = require('./lauxlib.js'); const lbaselib = require('./lbaselib.js'); @@ -24,9 +25,9 @@ const loadedlibs = { const luaL_openlibs = function(L) { /* "require" functions from 'loadedlibs' and set results to global table */ for (let lib in loadedlibs) { - lauxlib.luaL_requiref(L, lib, loadedlibs[lib], 1); + lauxlib.luaL_requiref(L, lua.to_luastring(lib), loadedlibs[lib], 1); lapi.lua_pop(L, 1); /* remove lib */ } }; -module.exports.luaL_openlibs = luaL_openlibs; \ No newline at end of file +module.exports.luaL_openlibs = luaL_openlibs; diff --git a/src/llex.js b/src/llex.js index 9b81cd7..e043c17 100644 --- a/src/llex.js +++ b/src/llex.js @@ -15,6 +15,12 @@ const TS = lua.thread_status; const FIRST_RESERVED = 257; +// To avoid charCodeAt everywhere +const char = []; +for (let i = 0; i < 127; i++) + char[String.fromCharCode(i)] = i; +module.exports.char = char; + const RESERVED = { /* terminal symbols denoted by reserved words */ TK_AND: FIRST_RESERVED, @@ -157,7 +163,7 @@ const save = function(ls, c) { const luaX_token2str = function(ls, token) { if (typeof token === "string" || token < FIRST_RESERVED) { /* single-byte symbols? */ - return lua.to_luastring(`'${typeof token === "string" ? token : lobject.jsstring(token)}'`); + return lua.to_luastring(`'${typeof token === "string" ? token : lobject.jsstring([token])}'`); } else { let s = luaX_tokens[token - FIRST_RESERVED]; if (token < R.TK_EOS) /* fixed format (symbols and reserved words)? */ @@ -168,7 +174,7 @@ const luaX_token2str = function(ls, token) { }; const currIsNewline = function(ls) { - return ls.current === '\n'.charCodeAt(0) || ls.current === '\r'.charCodeAt(0); + return ls.current === char['\n'] || ls.current === char['\r']; }; const next = function(ls) { @@ -235,7 +241,7 @@ const check_next1 = function(ls, c) { ** saves it */ const check_next2 = function(ls, set) { - if (ls.current === set.charAt(0).charCodeAt(0) || ls.current === set.charAt(1).charCodeAt(0)) { + if (ls.current === set[0].charCodeAt(0) || ls.current === set[1].charCodeAt(0)) { save_and_next(ls); return true; } @@ -248,7 +254,7 @@ const read_numeral = function(ls, seminfo) { let first = ls.current; assert(ljstype.lisdigit(ls.current)); save_and_next(ls); - if (first === '0' && check_next2(ls, "xX")) /* hexadecimal? */ + if (first === char['0'] && check_next2(ls, "xX")) /* hexadecimal? */ expo = "Pp"; for (;;) { @@ -256,7 +262,7 @@ const read_numeral = function(ls, seminfo) { check_next2(ls, "-+"); /* optional exponent sign */ if (ljstype.lisxdigit(ls.current)) save_and_next(ls); - else if (ls.current === '.') + else if (ls.current === char['.']) save_and_next(ls); else break; } @@ -295,7 +301,6 @@ const lexerror = function(ls, msg, token) { }; const luaX_syntaxerror = function(ls, msg) { - msg = msg instanceof TValue ? msg.value : lua.to_luastring(msg); lexerror(ls, msg, ls.t.token); }; @@ -307,9 +312,9 @@ const luaX_syntaxerror = function(ls, msg) { const skip_sep = function(ls) { let count = 0; let s = ls.current; - assert(s === '['.charCodeAt(0) || s === ']'.charCodeAt(0)); + assert(s === char['['] || s === char[']']); save_and_next(ls); - while (ls.current === '='.charCodeAt(0)) { + while (ls.current === char['=']) { save_and_next(ls); count++; } @@ -332,15 +337,15 @@ const read_long_string = function(ls, seminfo, sep) { lexerror(ls, lua.to_luastring(msg), R.TK_EOS); break; } - case ']'.charCodeAt(0): { + case char[']']: { if (skip_sep(ls) === sep) { save_and_next(ls); /* skip 2nd ']' */ skip = true; } break; } - case '\n'.charCodeAt(0): case '\r'.charCodeAt(0): { - save(ls, '\n'.charCodeAt(0)); + case char['\n']: case char['\r']: { + save(ls, char['\n']); inclinenumber(ls); if (!seminfo) { ls.buff.n = 0; @@ -386,7 +391,7 @@ const readhexaesc = function(ls) { const readutf8desc = function(ls) { let i = 4; /* chars to be removed: '\', 'u', '{', and first digit */ save_and_next(ls); /* skip 'u' */ - esccheck(ls, ls.current === '{'.charCodeAt(0), lua.to_luastring("missing '{'")); + esccheck(ls, ls.current === char['{'], lua.to_luastring("missing '{'")); let r = gethexa(ls); /* must have at least one digit */ save_and_next(ls); @@ -396,7 +401,7 @@ const readutf8desc = function(ls) { esccheck(ls, r <= 0x10FFFF, lua.to_luastring("UTF-8 value too large")); save_and_next(ls); } - esccheck(ls, ls.current === '}'.charCodeAt(0), lua.to_luastring("missing '}'")); + esccheck(ls, ls.current === char['}'], lua.to_luastring("missing '}'")); next(ls); /* skip '}' */ ls.buff.n -= i; /* remove saved chars from buffer */ return r; @@ -429,30 +434,30 @@ const read_string = function(ls, del, seminfo) { case -1: lexerror(ls, lua.to_luastring("unfinished string"), R.TK_EOS); break; - case '\n'.charCodeAt(0): - case '\r'.charCodeAt(0): + case char['\n']: + case char['\r']: lexerror(ls, lua.to_luastring("unfinished string"), R.TK_STRING); break; - case '\\'.charCodeAt(0): { /* escape sequences */ + case char['\\']: { /* escape sequences */ save_and_next(ls); /* keep '\\' for error messages */ let will; let c; switch(ls.current) { - case 'a': c = '\a'.charCodeAt(0); will = 'read_save'; break; - case 'b': c = '\b'.charCodeAt(0); will = 'read_save'; break; - case 'f': c = '\f'.charCodeAt(0); will = 'read_save'; break; - case 'n': c = '\n'.charCodeAt(0); will = 'read_save'; break; - case 'r': c = '\r'.charCodeAt(0); will = 'read_save'; break; - case 't': c = '\t'.charCodeAt(0); will = 'read_save'; break; - case 'v': c = '\v'.charCodeAt(0); will = 'read_save'; break; - case 'x': c = readhexaesc(ls); will = 'read_save'; break; - case 'u': utf8esc(ls); will = 'no_save'; break; - case '\n'.charCodeAt(0): case '\r'.charCodeAt(0): - inclinenumber(ls); c = '\n'; will = 'only_save'; break; - case '\\'.charCodeAt(0): case '\"'.charCodeAt(0): case '\''.charCodeAt(0): + case char['a']: c = char['\a']; will = 'read_save'; break; + case char['b']: c = char['\b']; will = 'read_save'; break; + case char['f']: c = char['\f']; will = 'read_save'; break; + case char['n']: c = char['\n']; will = 'read_save'; break; + case char['r']: c = char['\r']; will = 'read_save'; break; + case char['t']: c = char['\t']; will = 'read_save'; break; + case char['v']: c = char['\v']; will = 'read_save'; break; + case char['x']: c = readhexaesc(ls); will = 'read_save'; break; + case char['u']: utf8esc(ls); will = 'no_save'; break; + case char['\n']: case char['\r']: + inclinenumber(ls); c = char['\n']; will = 'only_save'; break; + case char['\\']: case char['\"']: case char['\'']: c = ls.current; will = 'read_save'; break; case -1: will = 'no_save'; break; /* will raise an error next loop */ - case 'z': { /* zap following span of spaces */ + case char['z']: { /* zap following span of spaces */ ls.buff.n -= 1; /* remove '\\' */ next(ls); /* skip the 'z' */ while (ljstype.lisspace(ls.current)) { @@ -500,20 +505,20 @@ const llex = function(ls, seminfo) { for (;;) { switch (ls.current) { - case '\n'.charCodeAt(0): case '\r'.charCodeAt(0): { /* line breaks */ + case char['\n']: case char['\r']: { /* line breaks */ inclinenumber(ls); break; } - case ' '.charCodeAt(0): case '\f'.charCodeAt(0): case '\t'.charCodeAt(0): case '\v'.charCodeAt(0): { /* spaces */ + case char[' ']: case char['\f']: case char['\t']: case char['\v']: { /* spaces */ next(ls); break; } - case '-'.charCodeAt(0): { /* '-' or '--' (comment) */ + case char['-']: { /* '-' or '--' (comment) */ next(ls); - if (ls.current !== '-'.charCodeAt(0)) return '-'; + if (ls.current !== char['-']) return char['-']; /* else is a comment */ next(ls); - if (ls.current === '['.charCodeAt(0)) { /* long comment? */ + if (ls.current === char['[']) { /* long comment? */ let sep = skip_sep(ls); ls.buff.n = 0; /* 'skip_sep' may dirty the buffer */ ls.buff.buffer = []; @@ -530,63 +535,63 @@ const llex = function(ls, seminfo) { next(ls); /* skip until end of line (or end of file) */ break; } - case '['.charCodeAt(0): { /* long string or simply '[' */ + case char['[']: { /* long string or simply '[' */ let sep = skip_sep(ls); if (sep >= 0) { read_long_string(ls, seminfo, sep); return R.TK_STRING; } else if (sep !== -1) /* '[=...' missing second bracket */ lexerror(ls, lua.to_luastring("invalid long string delimiter"), R.TK_STRING); - return '['; + return char['[']; } - case '='.charCodeAt(0): { + case char['=']: { next(ls); if (check_next1(ls, '=')) return R.TK_EQ; - else return '='; + else return char['=']; } - case '<'.charCodeAt(0): { + case char['<']: { next(ls); if (check_next1(ls, '=')) return R.TK_LE; else if (check_next1(ls, '<')) return R.TK_SHL; - else return '<'; + else return char['<']; } - case '>'.charCodeAt(0): { + case char['>']: { next(ls); if (check_next1(ls, '=')) return R.TK_GE; else if (check_next1(ls, '>')) return R.TK_SHR; - else return '>'; + else return char['>']; } - case '/'.charCodeAt(0): { + case char['/']: { next(ls); if (check_next1(ls, '/')) return R.TK_IDIV; - else return '/'; + else return char['/']; } - case '~'.charCodeAt(0): { + case char['~']: { next(ls); if (check_next1(ls, '=')) return R.TK_NE; - else return '~'; + else return char['~']; } - case ':'.charCodeAt(0): { + case char[':']: { next(ls); if (check_next1(ls, ':')) return R.TK_DBCOLON; - else return ':'; + else return char[':']; } - case '"'.charCodeAt(0): case '\''.charCodeAt(0): { /* short literal strings */ + case char['"']: case char['\'']: { /* short literal strings */ read_string(ls, ls.current, seminfo); return R.TK_STRING; } - case '.'.charCodeAt(0): { /* '.', '..', '...', or number */ + case char['.']: { /* '.', '..', '...', or number */ save_and_next(ls); if (check_next1(ls, '.')) { if (check_next1(ls, '.')) return R.TK_DOTS; /* '...' */ else return R.TK_CONCAT; /* '..' */ } - else if (!ljstype.lisdigit(ls.current)) return '.'; + else if (!ljstype.lisdigit(ls.current)) return char['.']; else return read_numeral(ls, seminfo); } - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { + case char['0']: case char['1']: case char['2']: case char['3']: case char['4']: + case char['5']: case char['6']: case char['7']: case char['8']: case char['9']: { return read_numeral(ls, seminfo); } case -1: { @@ -598,7 +603,7 @@ const llex = function(ls, seminfo) { save_and_next(ls); } while (ljstype.lislalnum(ls.current)); - let ts = new TValue(CT.LUA_TLNGSTR, lua.to_luastring(ls.buff.buffer.join(''))); + let ts = new TValue(CT.LUA_TLNGSTR, ls.buff.buffer); seminfo.ts = ts; let kidx = luaX_tokens.slice(0, 22).indexOf(ts.jsstring()); if (kidx >= 0) /* reserved word? */ diff --git a/src/lobject.js b/src/lobject.js index 812ac6a..e958975 100644 --- a/src/lobject.js +++ b/src/lobject.js @@ -132,6 +132,8 @@ const luaO_nilobject = new TValue(CT.LUA_TNIL, null); module.exports.luaO_nilobject = luaO_nilobject; const jsstring = function(value, from, to) { + assert(Array.isArray(value), "jsstring expect a array of bytes"); + let u0, u1, u2, u3, u4, u5; let idx = 0; value = value.slice(from ? from : 0, to); @@ -194,6 +196,8 @@ class Table extends TValue { } } else if (typeof key === "string") { // To avoid key = lua.to_luastring(key).map(e => `${e}|`).join(''); + } else if (Array.isArray(key)) { + key = key.map(e => `${e}|`).join(''); } return key; @@ -293,7 +297,7 @@ const luaO_chunkid = function(source, bufflen) { else { /* truncate it */ out = out.concat(source.slice(1, bufflen)); } - } else if (source.charAt(0) === '@') { /* file name */ + } else if (source[0] === '@'.charCodeAt(0)) { /* file name */ if (l <= bufflen) /* small enough? */ out = source.slice(1); else { /* add '...' before rest of name */ diff --git a/src/lparser.js b/src/lparser.js index 01b9a08..249d51f 100644 --- a/src/lparser.js +++ b/src/lparser.js @@ -18,6 +18,8 @@ const Table = lobject.Table; const UnOpr = lcode.UnOpr; const UpVal = lfunc.UpVal; +const char = llex.char; + const MAXVARS = 200; const hasmultret = function(k) { @@ -248,7 +250,7 @@ const new_localvar = function(ls, name) { }; const new_localvarliteral = function(ls, name) { - new_localvar(ls, new TValue(lua.CT.LUA_TLNGSTR, lua.to_luastring(name))); + new_localvar(ls, new TValue(lua.CT.LUA_TLNGSTR, name)); }; const getlocvar = function(fs, i) { @@ -273,7 +275,7 @@ const removevars = function(fs, tolevel) { const searchupvalue = function(fs, name) { let up = fs.f.upvalues; for (let i = 0; i < fs.nups; i++) { - if (up[i].name.join() === name.join()) + if (up[i].name.value.join() === name.value.join()) return i; } return -1; /* not found */ @@ -291,7 +293,7 @@ const newupvalue = function(fs, name, v) { const searchvar = function(fs, n) { for (let i = fs.nactvar - 1; i >= 0; i--) { - if (n.join() === getlocvar(fs, i).varname.join()) + if (n.value.join() === getlocvar(fs, i).varname.value.join()) return i; } @@ -611,7 +613,7 @@ const yindex = function(ls, v) { llex.luaX_next(ls); /* skip the '[' */ expr(ls, v); lcode.luaK_exp2val(ls.fs, v); - checknext(ls, ']'); + checknext(ls, char[']']); }; /* @@ -643,7 +645,7 @@ const recfield = function(ls, cc) { } else /* ls->t.token === '[' */ yindex(ls, key); cc.nh++; - checknext(ls, '='); + checknext(ls, char['=']); let rkkey = lcode.luaK_exp2RK(fs, key); expr(ls, val); lcode.luaK_codeABC(fs, OpCodesI.OP_SETTABLE, cc.t.u.info, rkkey, lcode.luaK_exp2RK(fs, val)); @@ -685,13 +687,13 @@ const field = function(ls, cc) { /* field -> listfield | recfield */ switch (ls.t.token) { case R.TK_NAME: { /* may be 'listfield' or 'recfield' */ - if (llex.luaX_lookahead(ls) !== '=') /* expression? */ + if (llex.luaX_lookahead(ls) !== char['=']) /* expression? */ listfield(ls, cc); else recfield(ls, cc); break; } - case '[': { + case char['[']: { recfield(ls, cc); break; } @@ -714,14 +716,14 @@ const constructor = function(ls, t) { init_exp(t, expkind.VRELOCABLE, pc); init_exp(cc.v, expkind.VVOID, 0); /* no value (yet) */ lcode.luaK_exp2nextreg(ls.fs, t); /* fix it at stack top */ - checknext(ls, '{'); + checknext(ls, char['{']); do { assert(cc.v.k === expkind.VVOID || cc.tostore > 0); - if (ls.t.token === '}') break; + if (ls.t.token === char['}']) break; closelistfield(fs, cc); field(ls, cc); - } while (testnext(ls, ',') || testnext(ls, ';')); - check_match(ls, '}', '{', line); + } while (testnext(ls, char[',']) || testnext(ls, char[';'])); + check_match(ls, char['}'], char['{'], line); lastlistfield(fs, cc); lopcode.SETARG_B(fs.f.code[pc], lobject.luaO_int2fb(cc.na)); /* set initial array size */ lopcode.SETARG_C(fs.f.code[pc], lobject.luaO_int2fb(cc.nh)); /* set initial table size */ @@ -735,7 +737,7 @@ const parlist = function(ls) { let f = fs.f; let nparams = 0; f.is_vararg = 0; - if (ls.t.token !== ')') { /* is 'parlist' not empty? */ + if (ls.t.token !== char[')']) { /* is 'parlist' not empty? */ do { switch (ls.t.token) { case R.TK_NAME: { /* param -> NAME */ @@ -750,7 +752,7 @@ const parlist = function(ls) { } default: llex.luaX_syntaxerror(ls, lua.to_luastring(" or '...' expected")); } - } while(!f.is_vararg && testnext(ls, ',')); + } while(!f.is_vararg && testnext(ls, char[','])); } adjustlocalvars(ls, nparams); f.numparams = fs.nactvar; @@ -764,13 +766,13 @@ const body = function(ls, e, ismethod, line) { new_fs.f = addprototype(ls); new_fs.f.linedefined = line; open_func(ls, new_fs, bl); - checknext(ls, '('); + checknext(ls, char['(']); if (ismethod) { new_localvarliteral(ls, lua.to_luastring("self")); /* create 'self' parameter */ adjustlocalvars(ls, 1); } parlist(ls); - checknext(ls, ')'); + checknext(ls, char[')']); statlist(ls); new_fs.f.lastlinedefined = ls.linenumber; check_match(ls, R.TK_END, R.TK_FUNCTION, line); @@ -782,7 +784,7 @@ const explist = function(ls, v) { /* explist -> expr { ',' expr } */ let n = 1; /* at least one expression */ expr(ls, v); - while (testnext(ls, ',')) { + while (testnext(ls, char[','])) { lcode.luaK_exp2nextreg(ls.fs, v); expr(ls, v); n++; @@ -794,18 +796,18 @@ const funcargs = function(ls, f, line) { let fs = ls.fs; let args = new expdesc(); switch (ls.t.token) { - case '(': { /* funcargs -> '(' [ explist ] ')' */ + case char['(']: { /* funcargs -> '(' [ explist ] ')' */ llex.luaX_next(ls); - if (ls.t.token === ')') /* arg list is empty? */ + if (ls.t.token === char[')']) /* arg list is empty? */ args.k = expkind.VVOID; else { explist(ls, args); lcode.luaK_setmultret(fs, args); } - check_match(ls, ')', '(', line); + check_match(ls, char[')'], char['('], line); break; } - case '{': { /* funcargs -> constructor */ + case char['{']: { /* funcargs -> constructor */ constructor(ls, args); break; } @@ -842,11 +844,11 @@ const funcargs = function(ls, f, line) { const primaryexp = function(ls, v) { /* primaryexp -> NAME | '(' expr ')' */ switch (ls.t.token) { - case '(': { + case char['(']: { let line = ls.linenumber; llex.luaX_next(ls); expr(ls, v); - check_match(ls, ')', '(', line); + check_match(ls, char[')'], char['('], line); lcode.luaK_dischargevars(ls.fs, v); return; } @@ -868,18 +870,18 @@ const suffixedexp = function(ls, v) { primaryexp(ls, v); for (;;) { switch (ls.t.token) { - case '.': { /* fieldsel */ + case char['.']: { /* fieldsel */ fieldsel(ls, v); break; } - case '[': { /* '[' exp1 ']' */ + case char['[']: { /* '[' exp1 ']' */ let key = new expdesc(); lcode.luaK_exp2anyregup(fs, v); yindex(ls, key); lcode.luaK_indexed(fs, v, key); break; } - case ':': { /* ':' NAME funcargs */ + case char[':']: { /* ':' NAME funcargs */ let key = new expdesc(); llex.luaX_next(ls); checkname(ls, key); @@ -887,7 +889,7 @@ const suffixedexp = function(ls, v) { funcargs(ls, v, line); break; } - case '(': case R.TK_STRING: case '{': { /* funcargs */ + case char['(']: case R.TK_STRING: case char['{']: { /* funcargs */ lcode.luaK_exp2nextreg(fs, v); funcargs(ls, v, line); break; @@ -933,7 +935,7 @@ const simpleexp = function(ls, v) { init_exp(v, expkind.VVARARG, lcode.luaK_codeABC(fs, OpCodesI.OP_VARARG, 0, 1, 0)); break; } - case '{': { /* constructor */ + case char['{']: { /* constructor */ constructor(ls, v); return; } @@ -952,34 +954,34 @@ const simpleexp = function(ls, v) { const getunopr = function(op) { switch (op) { - case R.TK_NOT: return UnOpr.OPR_NOT; - case '-': return UnOpr.OPR_MINUS; - case '~': return UnOpr.OPR_BNOT; - case '#': return UnOpr.OPR_LEN; - default: return UnOpr.OPR_NOUNOPR; + case R.TK_NOT: return UnOpr.OPR_NOT; + case char['-']: return UnOpr.OPR_MINUS; + case char['~']: return UnOpr.OPR_BNOT; + case char['#']: return UnOpr.OPR_LEN; + default: return UnOpr.OPR_NOUNOPR; } }; const getbinopr = function(op) { switch (op) { - case '+': return BinOpr.OPR_ADD; - case '-': return BinOpr.OPR_SUB; - case '*': return BinOpr.OPR_MUL; - case '%': return BinOpr.OPR_MOD; - case '^': return BinOpr.OPR_POW; - case '/': return BinOpr.OPR_DIV; + case char['+']: return BinOpr.OPR_ADD; + case char['-']: return BinOpr.OPR_SUB; + case char['*']: return BinOpr.OPR_MUL; + case char['%']: return BinOpr.OPR_MOD; + case char['^']: return BinOpr.OPR_POW; + case char['/']: return BinOpr.OPR_DIV; case R.TK_IDIV: return BinOpr.OPR_IDIV; - case '&': return BinOpr.OPR_BAND; - case '|': return BinOpr.OPR_BOR; - case '~': return BinOpr.OPR_BXOR; + case char['&']: return BinOpr.OPR_BAND; + case char['|']: return BinOpr.OPR_BOR; + case char['~']: return BinOpr.OPR_BXOR; case R.TK_SHL: return BinOpr.OPR_SHL; case R.TK_SHR: return BinOpr.OPR_SHR; case R.TK_CONCAT: return BinOpr.OPR_CONCAT; case R.TK_NE: return BinOpr.OPR_NE; case R.TK_EQ: return BinOpr.OPR_EQ; - case '<': return BinOpr.OPR_LT; + case char['<']: return BinOpr.OPR_LT; case R.TK_LE: return BinOpr.OPR_LE; - case '>': return BinOpr.OPR_GT; + case char['>']: return BinOpr.OPR_GT; case R.TK_GE: return BinOpr.OPR_GE; case R.TK_AND: return BinOpr.OPR_AND; case R.TK_OR: return BinOpr.OPR_OR; @@ -1102,7 +1104,7 @@ const check_conflict = function(ls, lh, v) { const assignment = function(ls, lh, nvars) { let e = new expdesc(); check_condition(ls, vkisvar(lh.v.k), lua.to_luastring("syntax error")); - if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ + if (testnext(ls, char[','])) { /* assignment -> ',' suffixedexp assignment */ let nv = new LHS_assign(); nv.prev = lh; suffixedexp(ls, nv.v); @@ -1111,7 +1113,7 @@ const assignment = function(ls, lh, nvars) { checklimit(ls.fs, nvars + ls.L.nCcalls, llimit.LUAI_MAXCCALLS, lua.to_luastring("JS levels")); assignment(ls, nv, nvars + 1); } else { /* assignment -> '=' explist */ - checknext(ls, '='); + checknext(ls, char['=']); let nexps = explist(ls, e); if (nexps !== nvars) adjust_assign(ls, nvars, nexps, e); @@ -1158,7 +1160,7 @@ const checkrepeated = function(fs, ll, label) { /* skip no-op statements */ const skipnoopstat = function(ls) { - while (ls.t.token === ';' || ls.t.token === R.TK_DBCOLON) + while (ls.t.token === char[';'] || ls.t.token === R.TK_DBCOLON) statement(ls); }; @@ -1256,11 +1258,11 @@ const fornum = function(ls, varname, line) { new_localvarliteral(ls, lua.to_luastring("(for limit)")); new_localvarliteral(ls, lua.to_luastring("(for step)")); new_localvar(ls, varname); - checknext(ls, '='); + checknext(ls, char['=']); exp1(ls); /* initial value */ - checknext(ls, ','); + checknext(ls, char[',']); exp1(ls); /* limit */ - if (testnext(ls, ',')) + if (testnext(ls, char[','])) exp1(ls); /* optional step */ else { /* default step = 1 */ lcode.luaK_codek(fs, fs.freereg, lcode.luaK_intK(fs, 1)); @@ -1281,7 +1283,7 @@ const forlist = function(ls, indexname) { new_localvarliteral(ls, lua.to_luastring("(for control)")); /* create declared variables */ new_localvar(ls, indexname); - while (testnext(ls, ',')) { + while (testnext(ls, char[','])) { new_localvar(ls, str_checkname(ls)); nvars++; } @@ -1300,8 +1302,8 @@ const forstat = function(ls, line) { llex.luaX_next(ls); /* skip 'for' */ let varname = str_checkname(ls); /* first variable name */ switch (ls.t.token) { - case '=': fornum(ls, varname, line); break; - case ',': case R.TK_IN: forlist(ls, varname); break; + case char['=']: fornum(ls, varname, line); break; + case char[',']: case R.TK_IN: forlist(ls, varname); break; default: llex.luaX_syntaxerror(ls, lua.to_luastring("'=' or 'in' expected")); } check_match(ls, R.TK_END, R.TK_FOR, line); @@ -1373,8 +1375,8 @@ const localstat = function(ls) { do { new_localvar(ls, str_checkname(ls)); nvars++; - } while (testnext(ls, ',')); - if (testnext(ls, '=')) + } while (testnext(ls, char[','])); + if (testnext(ls, char['='])) nexps = explist(ls, e); else { e.k = expkind.VVOID; @@ -1388,9 +1390,9 @@ const funcname = function(ls, v) { /* funcname -> NAME {fieldsel} [':' NAME] */ let ismethod = 0; singlevar(ls, v); - while (ls.t.token === '.') + while (ls.t.token === char['.']) fieldsel(ls, v); - if (ls.t.token === ':') { + if (ls.t.token === char[':']) { ismethod = 1; fieldsel(ls, v); } @@ -1413,7 +1415,7 @@ const exprstat= function(ls) { let fs = ls.fs; let v = new LHS_assign(); suffixedexp(ls, v.v); - if (ls.t.token === '=' || ls.t.token === ',') { /* stat . assignment ? */ + if (ls.t.token === char['='] || ls.t.token === char[',']) { /* stat . assignment ? */ v.prev = null; assignment(ls, v, 1); } @@ -1428,7 +1430,7 @@ const retstat = function(ls) { let fs = ls.fs; let e = new expdesc(); let first, nret; /* registers with returned values */ - if (block_follow(ls, 1) || ls.t.token === ';') + if (block_follow(ls, 1) || ls.t.token === char[';']) first = nret = 0; /* return no values */ else { nret = explist(ls, e); /* optional return values */ @@ -1451,14 +1453,14 @@ const retstat = function(ls) { } } lcode.luaK_ret(fs, first, nret); - testnext(ls, ';'); /* skip optional semicolon */ + testnext(ls, char[';']); /* skip optional semicolon */ }; const statement = function(ls) { let line = ls.linenumber; /* may be needed for error messages */ enterlevel(ls); switch(ls.t.token) { - case ';': { /* stat -> ';' (empty statement) */ + case char[';']: { /* stat -> ';' (empty statement) */ llex.luaX_next(ls); /* skip ';' */ break; } @@ -1547,7 +1549,7 @@ const luaY_parser = function(L, z, buff, dyd, name, firstchar) { lexstate.h = new Table(); /* create table for scanner */ L.stack[L.top++] = lexstate.h; funcstate.f = cl.p = new Proto(L); - funcstate.f.source = new TValue(lua.CT.LUA_TLNGSTR, lua.to_luastring(name)); + funcstate.f.source = new TValue(lua.CT.LUA_TLNGSTR, name); lexstate.buff = buff; lexstate.dyd = dyd; dyd.actvar.n = dyd.gt.n = dyd.label.n = 0; diff --git a/src/lstrlib.js b/src/lstrlib.js index 471187b..e163485 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -1372,7 +1372,7 @@ const createmetatable = function(L) { lapi.lua_setmetatable(L, -2); /* set table as metatable for strings */ lapi.lua_pop(L, 1); /* pop dummy string */ lapi.lua_pushvalue(L, -2); /* get string library */ - lapi.lua_setfield(L, -2, "__index"); /* metatable.__index = string */ + lapi.lua_setfield(L, -2, lua.to_luastring("__index")); /* metatable.__index = string */ lapi.lua_pop(L, 1); /* pop metatable */ }; diff --git a/src/ltablib.js b/src/ltablib.js index c45f7e5..eaaf24d 100644 --- a/src/ltablib.js +++ b/src/ltablib.js @@ -163,7 +163,7 @@ const pack = function(L) { for (let i = n; i >= 1; i--) /* assign elements */ lapi.lua_seti(L, 1, i); lapi.lua_pushinteger(L, n); - lapi.lua_setfield(L, 1, "n"); /* t.n = number of elements */ + lapi.lua_setfield(L, 1, ["n".charCodeAt(0)]); /* t.n = number of elements */ return 1; /* return table */ }; diff --git a/src/ltm.js b/src/ltm.js index d2df961..4a90f6d 100644 --- a/src/ltm.js +++ b/src/ltm.js @@ -53,7 +53,7 @@ const luaT_typenames_ = [ "userdata", "thread", "proto" /* this last case is used for tests only */ -]; +].map(e => lua.to_luastring(e)); const ttypename = function(t) { return luaT_typenames_[t + 1]; diff --git a/src/lua.js b/src/lua.js index 4710ded..85d4b64 100644 --- a/src/lua.js +++ b/src/lua.js @@ -135,6 +135,8 @@ class lua_Debug { } const to_luastring = function(str, maxBytesToWrite) { + assert(typeof str === "string", "to_luastring expect a js string"); + maxBytesToWrite = maxBytesToWrite !== undefined ? maxBytesToWrite : Number.MAX_SAFE_INTEGER; let outU8Array = []; diff --git a/src/lundump.js b/src/lundump.js index 7452c43..36fd674 100644 --- a/src/lundump.js +++ b/src/lundump.js @@ -5,10 +5,8 @@ const fs = require('fs'); const assert = require('assert'); const lua = require('./lua.js'); -const LClosure = require('./lobject.js').LClosure; -const TValue = require('./lobject.js').TValue; +const lobject = require('./lobject.js'); const Proto = require('./lfunc.js').Proto; -const constant_types = require('./lua.js').constant_types; const OpCodes = require('./lopcodes.js'); const LUAI_MAXSHORTLEN = 40; @@ -167,20 +165,20 @@ class BytecodeParser { let t = this.readByte(); switch (t) { - case constant_types.LUA_TNIL: - f.k.push(new TValue(constant_types.LUA_TNIL, null)); + case lua.CT.LUA_TNIL: + f.k.push(new lobject.TValue(lua.CT.LUA_TNIL, null)); break; - case constant_types.LUA_TBOOLEAN: - f.k.push(new TValue(constant_types.LUA_TBOOLEAN, this.readByte())); + case lua.CT.LUA_TBOOLEAN: + f.k.push(new lobject.TValue(lua.CT.LUA_TBOOLEAN, this.readByte())); break; - case constant_types.LUA_TNUMFLT: - f.k.push(new TValue(constant_types.LUA_TNUMFLT, this.readNumber())); + case lua.CT.LUA_TNUMFLT: + f.k.push(new lobject.TValue(lua.CT.LUA_TNUMFLT, this.readNumber())); break; - case constant_types.LUA_TNUMINT: - f.k.push(new TValue(constant_types.LUA_TNUMINT, this.readInteger())); + case lua.CT.LUA_TNUMINT: + f.k.push(new lobject.TValue(lua.CT.LUA_TNUMINT, this.readInteger())); break; - case constant_types.LUA_TSHRSTR: - case constant_types.LUA_TLNGSTR: + case lua.CT.LUA_TSHRSTR: + case lua.CT.LUA_TLNGSTR: f.k.push(this.L.l_G.intern(this.read8bitString())); break; default: @@ -206,7 +204,7 @@ class BytecodeParser { n = this.readInt(); for (let i = 0; i < n; i++) { f.locvars[i] = { - varname: this.readString(), + varname: new lobject.TValue(lua.CT.LUA_TLNGSTR, lua.to_luastring(this.readString())), startpc: this.readInt(), endpc: this.readInt() }; @@ -264,7 +262,7 @@ class BytecodeParser { luaU_undump() { this.checkHeader(); - let cl = new LClosure(this.L, this.readByte()); + let cl = new lobject.LClosure(this.L, this.readByte()); this.L.stack[this.L.top] = cl; this.L.top++; @@ -280,4 +278,4 @@ class BytecodeParser { } -module.exports = BytecodeParser; \ No newline at end of file +module.exports = BytecodeParser; diff --git a/src/lutf8lib.js b/src/lutf8lib.js index 1df6096..ef9739f 100644 --- a/src/lutf8lib.js +++ b/src/lutf8lib.js @@ -58,50 +58,37 @@ const utf8_decode = function(s, val) { ** range [i,j], or nil + current position if 's' is not well formed in ** that interval */ -// const utflen = function(L) { -// let n = 0; -// let s = lauxlib.luaL_checkstring(L, 1); -// s = L.stack[lapi.index2addr_(L, 1)].value; -// let len = s.length; -// let posi = u_posrelat(lauxlib.luaL_optinteger(L, 2, 1), len); -// let posj = u_posrelat(lauxlib.luaL_optinteger(L, 3, -1), len); -// -// lauxlib.luaL_argcheck(L, 1 <= posi && --posi <= len, 2, "initial position out of string"); -// lauxlib.luaL_argcheck(L, --posj < len, 3, "final position out of string"); -// -// while (posi <= posj) { -// let dec = utf8_decode(s[posi]); -// let s1 = dec ? dec.string : null; -// if (s1 === null) { -// /* conversion error? */ -// lapi.lua_pushnil(L); /* return nil ... */ -// lapi.lua_pushinteger(L, posi + 1); /* ... and current position */ -// return 2; -// } -// posi = dec.pos; -// n++; -// } -// lapi.lua_pushinteger(L, n); -// return 1; -// }; - -// Shorter JSesque solution but doesn't take invalid UTF-8 sequence (but how can we get one ?) const utflen = function(L) { + let n = 0; let s = lauxlib.luaL_checkstring(L, 1); - let posi = u_posrelat(lauxlib.luaL_optinteger(L, 2, 1), s.length); - let posj = u_posrelat(lauxlib.luaL_optinteger(L, 3, -1), s.length); - - lauxlib.luaL_argcheck(L, 1 <= posi && --posi <= s.length, 2, lua.to_luastring("initial position out of string")); - lauxlib.luaL_argcheck(L, --posj < s.length, 3, lua.to_luastring("final position out of string")); - - lapi.lua_pushinteger(L, s.slice(posi, posj + 1).length); + s = L.stack[lapi.index2addr_(L, 1)].value; + let len = s.length; + let posi = u_posrelat(lauxlib.luaL_optinteger(L, 2, 1), len); + let posj = u_posrelat(lauxlib.luaL_optinteger(L, 3, -1), len); + + lauxlib.luaL_argcheck(L, 1 <= posi && --posi <= len, 2, "initial position out of string"); + lauxlib.luaL_argcheck(L, --posj < len, 3, "final position out of string"); + + while (posi <= posj) { + let dec = utf8_decode(s.slice(posi)); + let s1 = dec ? dec.string : null; + if (s1 === null) { + /* conversion error? */ + lapi.lua_pushnil(L); /* return nil ... */ + lapi.lua_pushinteger(L, posi + 1); /* ... and current position */ + return 2; + } + posi = s.length - s1.length; + n++; + } + lapi.lua_pushinteger(L, n); return 1; }; const pushutfchar = function(L, arg) { let code = lauxlib.luaL_checkinteger(L, arg); lauxlib.luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, lua.to_luastring("value out of range")); - lapi.lua_pushstring(L, `${String.fromCharCode(code)}`); + lapi.lua_pushstring(L, lua.to_luastring(String.fromCharCode(code))); }; /* @@ -248,8 +235,8 @@ const UTF8PATT = "[\0-\x7F\xC2-\xF4][\x80-\xBF]*"; const luaopen_utf8 = function(L) { lauxlib.luaL_newlib(L, funcs); - lapi.lua_pushstring(L, UTF8PATT); - lapi.lua_setfield(L, -2, "charpattern"); + lapi.lua_pushstring(L, lua.to_luastring(UTF8PATT)); + lapi.lua_setfield(L, -2, lua.to_luastring("charpattern")); return 1; }; diff --git a/src/lvm.js b/src/lvm.js index 53e1584..6f49ad3 100644 --- a/src/lvm.js +++ b/src/lvm.js @@ -592,19 +592,19 @@ const luaV_execute = function(L) { let nstep = tonumber(pstep); if (nlimit === false) - ldebug.luaG_runerror(L, "'for' limit must be a number"); + ldebug.luaG_runerror(L, lua.to_luastring("'for' limit must be a number")); plimit.type = CT.LUA_TNUMFLT; plimit.value = nlimit; if (nstep === false) - ldebug.luaG_runerror(L, "'for' step must be a number"); + ldebug.luaG_runerror(L, lua.to_luastring("'for' step must be a number")); pstep.type = CT.LUA_TNUMFLT; pstep.value = nstep; if (ninit === false) - ldebug.luaG_runerror(L, "'for' initial value must be a number"); + ldebug.luaG_runerror(L, lua.to_luastring("'for' initial value must be a number")); init.type = CT.LUA_TNUMFLT; init.value = ninit - nstep; @@ -977,7 +977,7 @@ const luaV_objlen = function(L, ra, rb) { default: { tm = ltm.luaT_gettmbyobj(L, rb, ltm.TMS.TM_LEN); if (tm.ttisnil()) - ldebug.luaG_typeerror(L, rb, "get length of"); + ldebug.luaG_typeerror(L, rb, lua.to_luastring("get length of")); break; } } @@ -1042,7 +1042,7 @@ const gettable = function(L, table, key, ra, recur) { recur = recur ? recur : 0; if (recur >= MAXTAGRECUR) - ldebug.luaG_runerror(L, "'__index' chain too long; possible loop"); + ldebug.luaG_runerror(L, lua.to_luastring("'__index' chain too long; possible loop")); if (table.ttistable()) { let element = table.__index(table, key); @@ -1063,7 +1063,7 @@ const luaV_finishget = function(L, t, key, val, slot, recur) { assert(!t.ttistable()); tm = ltm.luaT_gettmbyobj(L, t, ltm.TMS.TM_INDEX); if (tm.ttisnil()) - ldebug.luaG_typeerror(L, t, 'index'); + ldebug.luaG_typeerror(L, t, lua.to_luastring('index')); } else { /* 't' is a table */ assert(slot.ttisnil()); tm = ltm.luaT_gettmbyobj(L, t, ltm.TMS.TM_INDEX); // TODO: fasttm @@ -1085,7 +1085,7 @@ const settable = function(L, table, key, v, recur) { recur = recur ? recur : 0; if (recur >= MAXTAGRECUR) - ldebug.luaG_runerror(L, "'__newindex' chain too long; possible loop"); + ldebug.luaG_runerror(L, lua.to_luastring("'__newindex' chain too long; possible loop")); if (table.ttistable()) { let element = table.__index(table, key); @@ -1112,7 +1112,7 @@ const luaV_finishset = function(L, t, key, val, slot, recur) { } else { /* not a table; check metamethod */ tm = ltm.luaT_gettmbyobj(L, t, ltm.TMS.TM_NEWINDEX); if (tm.ttisnil()) - ldebug.luaG_typeerror(L, t, 'index'); + ldebug.luaG_typeerror(L, t, lua.to_luastring('index')); } if (tm.ttisfunction()) { diff --git a/tests/lapi.js b/tests/lapi.js index c422ada..c6e9c53 100644 --- a/tests/lapi.js +++ b/tests/lapi.js @@ -28,9 +28,9 @@ test('luaL_newstate, lua_pushnil, luaL_typename', function (t) { }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "nil", + "nil".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); }); @@ -49,9 +49,9 @@ test('lua_pushnumber', function (t) { }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "number", + "number".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); @@ -76,9 +76,9 @@ test('lua_pushinteger', function (t) { }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "number", + "number".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); @@ -90,7 +90,7 @@ test('lua_pushinteger', function (t) { }); -test('lua_pushstring', function (t) { +test('lua_pushliteral', function (t) { let L; t.plan(3); @@ -99,18 +99,18 @@ test('lua_pushstring', function (t) { L = lauxlib.luaL_newstate(); - lapi.lua_pushstring(L, "hello"); + lapi.lua_pushliteral(L, "hello"); }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "string", + "string".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "top is correct" ); @@ -130,9 +130,9 @@ test('lua_pushboolean', function (t) { }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "boolean", + "boolean".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); @@ -153,32 +153,32 @@ test('lua_pushvalue', function (t) { L = lauxlib.luaL_newstate(); - lapi.lua_pushstring(L, "hello"); + lapi.lua_pushliteral(L, "hello"); lapi.lua_pushvalue(L, -1); }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "string", + "string".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -2), - "string", + "string".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "hello", "Correct element(s) on the stack" ); @@ -198,14 +198,14 @@ test('lua_pushjsclosure', function (t) { L = lauxlib.luaL_newstate(); - lapi.lua_pushstring(L, "a value associated to the C closure"); + lapi.lua_pushliteral(L, "a value associated to the C closure"); lapi.lua_pushjsclosure(L, fn, 1); }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "function", + "function".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); }); @@ -228,9 +228,9 @@ test('lua_pushjsfunction', function (t) { }, "JS Lua program ran without error"); - t.strictEqual( + t.deepEqual( lauxlib.luaL_typename(L, -1), - "function", + "function".split('').map(e => e.charCodeAt(0)), "Correct element(s) on the stack" ); }); @@ -244,7 +244,7 @@ test('lua_call (calling a light JS function)', function (t) { t.doesNotThrow(function () { let fn = function(L) { - lapi.lua_pushstring(L, "hello"); + lapi.lua_pushliteral(L, "hello"); return 1; }; @@ -257,7 +257,7 @@ test('lua_call (calling a light JS function)', function (t) { }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "top is correct" ); @@ -278,7 +278,7 @@ test('lua_call (calling a JS closure)', function (t) { L = lauxlib.luaL_newstate(); - lapi.lua_pushstring(L, "upvalue hello !"); + lapi.lua_pushliteral(L, "upvalue hello !"); lapi.lua_pushjsclosure(L, fn, 1); lapi.lua_call(L, 0, 1); @@ -286,7 +286,7 @@ test('lua_call (calling a JS closure)', function (t) { }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "upvalue hello !", "top is correct" ); @@ -301,7 +301,7 @@ test('lua_pcall (calling a light JS function)', function (t) { t.doesNotThrow(function () { let fn = function(L) { - lapi.lua_pushstring(L, "hello"); + lapi.lua_pushliteral(L, "hello"); return 1; }; @@ -314,7 +314,7 @@ test('lua_pcall (calling a light JS function)', function (t) { }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "top is correct" ); @@ -353,15 +353,15 @@ test('lua_pop', function (t) { L = lauxlib.luaL_newstate(); - lapi.lua_pushstring(L, "hello"); - lapi.lua_pushstring(L, "world"); + lapi.lua_pushliteral(L, "hello"); + lapi.lua_pushliteral(L, "world"); lapi.lua_pop(L, 1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Correct element(s) on the stack" ); @@ -382,14 +382,14 @@ test('lua_load and lua_call it', function (t) { L = lauxlib.luaL_newstate(); - lapi.lua_load(L, null, bc, "test-lua_load", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-lua_load"), lua.to_luastring("binary")); lapi.lua_call(L, 0, 1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "JS > Lua > JS \o/", "Correct element(s) on the stack" ); @@ -409,17 +409,17 @@ test('lua script reads js upvalues', function (t) { L = lauxlib.luaL_newstate(); - lapi.lua_load(L, null, bc, "test-lua_load", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-lua_load"), lua.to_luastring("binary")); - lapi.lua_pushstring(L, "hello"); - lapi.lua_setglobal(L, "js"); + lapi.lua_pushliteral(L, "hello"); + lapi.lua_setglobal(L, lua.to_luastring("js")); lapi.lua_call(L, 0, 1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); @@ -474,19 +474,19 @@ test('lua_settable, lua_gettable', function (t) { lapi.lua_newtable(L); - lapi.lua_pushstring(L, "key"); - lapi.lua_pushstring(L, "value"); + lapi.lua_pushliteral(L, "key"); + lapi.lua_pushliteral(L, "value"); lapi.lua_settable(L, -3); - lapi.lua_pushstring(L, "key"); + lapi.lua_pushliteral(L, "key"); lapi.lua_gettable(L, -2); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "value", "Correct element(s) on the stack" ); -}); \ No newline at end of file +}); diff --git a/tests/lbaselib.js b/tests/lbaselib.js index be741dc..dd91449 100644 --- a/tests/lbaselib.js +++ b/tests/lbaselib.js @@ -31,7 +31,7 @@ test('print', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-print", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-print"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -65,14 +65,14 @@ test('setmetatable, getmetatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-setmetatable-getmetatable", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-setmetatable-getmetatable"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "hello", "Correct element(s) on the stack" ); @@ -110,7 +110,7 @@ test('rawequal', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-rawequal", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-rawequal"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -156,32 +156,32 @@ test('rawset, rawget', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-rawequal", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-rawequal"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -4), + lapi.lua_tojsstring(L, -4), "hello", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -3), + lapi.lua_tojsstring(L, -3), "hello", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "bye", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "bye", "Correct element(s) on the stack" ); @@ -203,38 +203,38 @@ test('type', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-type", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-type"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -5), + lapi.lua_tojsstring(L, -5), "number", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -4), + lapi.lua_tojsstring(L, -4), "boolean", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -3), + lapi.lua_tojsstring(L, -3), "string", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "table", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "nil", "Correct element(s) on the stack" ); @@ -256,7 +256,7 @@ test('error', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-error", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-error"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -279,14 +279,14 @@ test('error, protected', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-error", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-error"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("you fucked up"), + lapi.lua_tojsstring(L, -1).endsWith("you fucked up"), "Error is on the stack" ); }); @@ -311,14 +311,14 @@ test('pcall', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-pcall", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-pcall"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("you fucked up"), + lapi.lua_tojsstring(L, -1).endsWith("you fucked up"), "Error is on the stack" ); }); @@ -347,21 +347,21 @@ test('xpcall', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-pcall", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-pcall"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); - console.log(lapi.lua_tostring(L, -1)); + console.log(lapi.lua_tojsstring(L, -1)); t.ok( - lapi.lua_tostring(L, -1).startsWith("Something's wrong:"), + lapi.lua_tojsstring(L, -1).startsWith("Something's wrong:"), "msgh was called and modified the error" ); t.ok( - lapi.lua_tostring(L, -1).endsWith("you fucked up"), + lapi.lua_tojsstring(L, -1).endsWith("you fucked up"), "msgh was called and modified the error" ); }); @@ -389,7 +389,7 @@ test('ipairs', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-ipairs", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-ipairs"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -418,7 +418,7 @@ test('select', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-select", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-select"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -459,7 +459,7 @@ test('tonumber', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-tonumber", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-tonumber"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -506,14 +506,14 @@ test('assert', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-assert", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-assert"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("this doesn't makes sense"), + lapi.lua_tojsstring(L, -1).endsWith("this doesn't makes sense"), "Error is on the stack" ); }); @@ -534,7 +534,7 @@ test('rawlen', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-rawlen", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-rawlen"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -581,7 +581,7 @@ test('next', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-next", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-next"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -622,7 +622,7 @@ test('pairs', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-pairs", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-pairs"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -672,7 +672,7 @@ test('pairs with __pairs', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-pairs", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-pairs"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -683,4 +683,4 @@ test('pairs with __pairs', function (t) { 26, "Correct element(s) on the stack" ); -}); \ No newline at end of file +}); diff --git a/tests/lcorolib.js b/tests/lcorolib.js index 9c1d9b1..f709fa5 100644 --- a/tests/lcorolib.js +++ b/tests/lcorolib.js @@ -40,7 +40,7 @@ test('coroutine.create, coroutine.yield, coroutine.resume', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-coroutine", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-coroutine"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -83,20 +83,20 @@ test('coroutine.status', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-coroutine.status", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-coroutine.status"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "suspended", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "dead", "Correct element(s) on the stack" ); @@ -124,7 +124,7 @@ test('coroutine.isyieldable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-coroutine.isyieldable", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-coroutine.isyieldable"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -165,7 +165,7 @@ test('coroutine.running', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-coroutine.running", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-coroutine.running"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -206,7 +206,7 @@ test('coroutine.wrap', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-coroutine.wrap", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-coroutine.wrap"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -217,4 +217,4 @@ test('coroutine.wrap', function (t) { 625, "Correct element(s) on the stack" ); -}); \ No newline at end of file +}); diff --git a/tests/ldebug.js b/tests/ldebug.js index 0261305..e24b584 100644 --- a/tests/ldebug.js +++ b/tests/ldebug.js @@ -30,7 +30,7 @@ test('luaG_typeerror', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-typeerror", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-typeerror"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); @@ -38,7 +38,7 @@ test('luaG_typeerror', function (t) { t.ok( - lapi.lua_tostring(L, -1).endsWith("attempt to get length of a boolean value (local 'a')"), + lapi.lua_tojsstring(L, -1).endsWith("attempt to get length of a boolean value (local 'a')"), "Correct error was thrown" ); }); @@ -60,14 +60,14 @@ test('luaG_typeerror', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-typeerror", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-typeerror"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("attempt to index a boolean value (local 'a')"), + lapi.lua_tojsstring(L, -1).endsWith("attempt to index a boolean value (local 'a')"), "Correct error was thrown" ); }); @@ -89,14 +89,14 @@ test('luaG_typeerror', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-typeerror", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-typeerror"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("attempt to index a boolean value (local 'a')"), + lapi.lua_tojsstring(L, -1).endsWith("attempt to index a boolean value (local 'a')"), "Correct error was thrown" ); }); @@ -118,14 +118,14 @@ test('luaG_typeerror', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-typeerror", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-typeerror"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("attempt to index a boolean value (local 'a')"), + lapi.lua_tojsstring(L, -1).endsWith("attempt to index a boolean value (local 'a')"), "Correct error was thrown" ); }); @@ -146,14 +146,14 @@ test('luaG_concaterror', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-typeerror", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-typeerror"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("attempt to concatenate a table value"), + lapi.lua_tojsstring(L, -1).endsWith("attempt to concatenate a table value"), "Correct error was thrown" ); }); @@ -174,14 +174,14 @@ test('luaG_opinterror', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-typeerror", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-typeerror"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("attempt to perform arithmetic on a string value"), + lapi.lua_tojsstring(L, -1).endsWith("attempt to perform arithmetic on a string value"), "Correct error was thrown" ); }); @@ -202,14 +202,14 @@ test('luaG_tointerror', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-typeerror", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-typeerror"), lua.to_luastring("binary")); lapi.lua_pcall(L, 0, -1, 0); }, "JS Lua program ran without error"); t.ok( - lapi.lua_tostring(L, -1).endsWith("number has no integer representation"), + lapi.lua_tojsstring(L, -1).endsWith("number has no integer representation"), "Correct error was thrown" ); -}); \ No newline at end of file +}); diff --git a/tests/lexparse.js b/tests/lexparse.js index 704f875..edffe53 100644 --- a/tests/lexparse.js +++ b/tests/lexparse.js @@ -6,6 +6,7 @@ const beautify = require('js-beautify').js_beautify; const tests = require("./tests.js"); const toByteCode = tests.toByteCode; +const lua = require("../src/lua.js"); const lapi = require("../src/lapi.js"); const lauxlib = require("../src/lauxlib.js"); const linit = require('../src/linit.js'); @@ -28,12 +29,12 @@ test('LOADK, RETURN', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -44,7 +45,7 @@ test('LOADK, RETURN', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); @@ -68,12 +69,12 @@ test('MOVE', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -84,7 +85,7 @@ test('MOVE', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); @@ -108,12 +109,12 @@ test('Binary op', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -148,12 +149,12 @@ test('Unary op, LOADBOOL', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -186,12 +187,12 @@ test('NEWTABLE', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -228,12 +229,12 @@ test('CALL', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -274,12 +275,12 @@ test('Multiple return', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -315,12 +316,12 @@ test('TAILCALL', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -356,12 +357,12 @@ test('VARARG', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -395,12 +396,12 @@ test('LE, JMP', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -434,12 +435,12 @@ test('LT', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -473,12 +474,12 @@ test('EQ', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -513,12 +514,12 @@ test('TESTSET (and)', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -529,7 +530,7 @@ test('TESTSET (and)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -553,12 +554,12 @@ test('TESTSET (or)', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -569,7 +570,7 @@ test('TESTSET (or)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -597,12 +598,12 @@ test('TEST (false)', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -613,7 +614,7 @@ test('TEST (false)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "goodbye", "Program output is correct" ); @@ -640,12 +641,12 @@ test('FORPREP, FORLOOP (int)', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -683,12 +684,12 @@ test('FORPREP, FORLOOP (float)', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -725,12 +726,12 @@ test('SETTABLE, GETTABLE', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -776,12 +777,12 @@ test('SETUPVAL, GETUPVAL', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -792,7 +793,7 @@ test('SETUPVAL, GETUPVAL', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "world", "Program output is correct" ); @@ -818,12 +819,12 @@ test('SETTABUP, GETTABUP', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -868,12 +869,12 @@ test('SELF', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -884,7 +885,7 @@ test('SELF', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -907,12 +908,12 @@ test('SETLIST', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -950,12 +951,12 @@ test('Variable SETLIST', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -988,12 +989,12 @@ test('Long SETLIST', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -1043,12 +1044,12 @@ test('TFORCALL, TFORLOOP', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -1084,12 +1085,12 @@ test('LEN', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -1133,12 +1134,12 @@ test('CONCAT', function (t) { linit.luaL_openlibs(L); let reader = function(L, data) { - let code = luaCode; + let code = luaCode ? luaCode.trim() : null; luaCode = null; return code; }; - lapi.lua_load(L, reader, luaCode, "test", "text"); + lapi.lua_load(L, reader, luaCode, lua.to_luastring("test"), lua.to_luastring("text")); }, "Lua program loaded without error"); @@ -1149,8 +1150,8 @@ test('CONCAT', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello 2 you", "Program output is correct" ); -}); \ No newline at end of file +}); diff --git a/tests/lmathlib.js b/tests/lmathlib.js index ae0c40b..6105af4 100644 --- a/tests/lmathlib.js +++ b/tests/lmathlib.js @@ -33,7 +33,7 @@ test('math.abs, math.sin, math.cos, math.tan, math.asin, math.acos, math.atan', linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -98,7 +98,7 @@ test('math.ceil, math.floor', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -134,7 +134,7 @@ test('math.deg, math.rad', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -170,7 +170,7 @@ test('math.log', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -212,7 +212,7 @@ test('math.exp', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -242,7 +242,7 @@ test('math.min, math.max', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -278,7 +278,7 @@ test('math.random', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -312,7 +312,7 @@ test('math.sqrt', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -342,7 +342,7 @@ test('math.tointeger', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -372,26 +372,26 @@ test('math.type', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -3), + lapi.lua_tojsstring(L, -3), "integer", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "float", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), null, "Correct element(s) on the stack" ); @@ -414,7 +414,7 @@ test('math.ult', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -444,7 +444,7 @@ test('math.fmod', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -474,7 +474,7 @@ test('math.modf', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-math", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-math"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); diff --git a/tests/load.js b/tests/load.js index 9b76ad3..9a53176 100644 --- a/tests/load.js +++ b/tests/load.js @@ -39,7 +39,7 @@ test('luaL_loadstring', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); @@ -72,7 +72,7 @@ test('load', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "js running lua running lua", "Correct element(s) on the stack" ); @@ -107,7 +107,7 @@ test('luaL_loadbuffer', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); @@ -140,7 +140,7 @@ test('loadfile', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); @@ -173,7 +173,7 @@ test('loadfile (binary)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); @@ -205,7 +205,7 @@ test('dofile', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Correct element(s) on the stack" ); diff --git a/tests/lstrlib.js b/tests/lstrlib.js index 12df173..2bde19d 100644 --- a/tests/lstrlib.js +++ b/tests/lstrlib.js @@ -6,6 +6,7 @@ const beautify = require('js-beautify').js_beautify; const tests = require("./tests.js"); const toByteCode = tests.toByteCode; +const lua = require("../src/lua.js"); const lapi = require("../src/lapi.js"); const lauxlib = require("../src/lauxlib.js"); const linit = require('../src/linit.js'); @@ -74,7 +75,7 @@ test('string.char', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Correct element(s) on the stack" ); @@ -105,13 +106,13 @@ test('string.upper, string.lower', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "HELLO", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Correct element(s) on the stack" ); @@ -142,7 +143,7 @@ test('string.rep', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello, hello, hello", "Correct element(s) on the stack" ); @@ -173,7 +174,7 @@ test('string.reverse', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Correct element(s) on the stack" ); @@ -247,7 +248,7 @@ test('string.format', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "%10 0000000023", "Correct element(s) on the stack" ); @@ -278,7 +279,7 @@ test('string.format', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "FFFFFFF", "Correct element(s) on the stack" ); @@ -309,7 +310,7 @@ test('string.format', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), '"a string with \\"quotes\\" and \\\n new line"', "Correct element(s) on the stack" ); @@ -350,67 +351,67 @@ test('string.sub', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -11), + lapi.lua_tojsstring(L, -11), "234", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -10), + lapi.lua_tojsstring(L, -10), "789", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -9), + lapi.lua_tojsstring(L, -9), "", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -8), + lapi.lua_tojsstring(L, -8), "7", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -7), + lapi.lua_tojsstring(L, -7), "", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -6), + lapi.lua_tojsstring(L, -6), "123456789", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -5), + lapi.lua_tojsstring(L, -5), "123456789", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -4), + lapi.lua_tojsstring(L, -4), "", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -3), + lapi.lua_tojsstring(L, -3), "9", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "6789", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "456", "Correct element(s) on the stack" ); @@ -448,14 +449,14 @@ test('string.dump', function (t) { let dv = lapi.lua_todataview(L, -1); - lapi.lua_load(L, null, dv, "test", "binary"); + lapi.lua_load(L, null, dv, lua.to_luastring("test"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello1212.5", "Correct element(s) on the stack" ); @@ -562,13 +563,13 @@ test('string.match', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "foo", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "123", "Correct element(s) on the stack" ); @@ -611,13 +612,13 @@ test('string.find', function (t) { ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "foo", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "123", "Correct element(s) on the stack" ); @@ -655,25 +656,25 @@ test('string.gmatch', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -4), + lapi.lua_tojsstring(L, -4), "hello", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -3), + lapi.lua_tojsstring(L, -3), "world", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "from", "Correct element(s) on the stack" ); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "Lua", "Correct element(s) on the stack" ); @@ -704,7 +705,7 @@ test('string.gsub', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "hello hello world world", "Correct element(s) on the stack" ); @@ -741,7 +742,7 @@ test('string.gsub (number)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "hello hello world", "Correct element(s) on the stack" ); @@ -778,7 +779,7 @@ test('string.gsub (pattern)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "world hello Lua from", "Correct element(s) on the stack" ); @@ -817,7 +818,7 @@ test('string.gsub (function)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "4+5 = 9", "Correct element(s) on the stack" ); @@ -856,7 +857,7 @@ test('string.gsub (table)', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "lua-5.3.tar.gz", "Correct element(s) on the stack" ); @@ -866,4 +867,4 @@ test('string.gsub (table)', function (t) { 2, "Correct element(s) on the stack" ); -}); \ No newline at end of file +}); diff --git a/tests/ltablib.js b/tests/ltablib.js index c8a1e73..81ffcbd 100644 --- a/tests/ltablib.js +++ b/tests/ltablib.js @@ -42,14 +42,14 @@ test('table.concat', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.concat", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.concat"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "JS Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "3,4,5", "Correct element(s) on the stack" ); @@ -71,7 +71,7 @@ test('table.pack', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.pack", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.pack"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -102,7 +102,7 @@ test('table.unpack', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.unpack", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.unpack"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -146,7 +146,7 @@ test('table.insert', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.insert", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.insert"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -180,7 +180,7 @@ test('table.remove', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.remove", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.remove"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -213,7 +213,7 @@ test('table.move', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.move", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.move"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -246,7 +246,7 @@ test('table.sort (<)', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.sort", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.sort"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -279,7 +279,7 @@ test('table.sort with cmp function', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test-table.sort", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test-table.sort"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); @@ -290,4 +290,4 @@ test('table.sort with cmp function', function (t) { [5, 4, 3, 2, 1], "Correct element(s) on the stack" ); -}); \ No newline at end of file +}); diff --git a/tests/ltm.js b/tests/ltm.js index 9eedc4c..501b062 100644 --- a/tests/ltm.js +++ b/tests/ltm.js @@ -3,6 +3,7 @@ const test = require('tape'); const beautify = require('js-beautify').js_beautify; +const lua = require("../src/lua.js"); const VM = require("../src/lvm.js"); const lapi = require("../src/lapi.js"); const linit = require("../src/linit.js"); @@ -31,7 +32,7 @@ test('__index, __newindex: with actual table', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); lapi.lua_call(L, 0, -1); }, "Program executed without errors"); @@ -65,7 +66,7 @@ test('__newindex: with non table', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.throws(function () { @@ -100,7 +101,7 @@ test('__index function in metatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); @@ -109,7 +110,7 @@ test('__index function in metatable', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "__index", "Program output is correct" ); @@ -144,7 +145,7 @@ test('__newindex function in metatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -186,7 +187,7 @@ test('__index table in metatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -194,7 +195,7 @@ test('__index table in metatable', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -231,7 +232,7 @@ test('__newindex table in metatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -239,7 +240,7 @@ test('__newindex table in metatable', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "world", "Program output is correct" ); @@ -287,7 +288,7 @@ test('__index table with own metatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -295,7 +296,7 @@ test('__index table with own metatable', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -342,7 +343,7 @@ test('__newindex table with own metatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -350,7 +351,7 @@ test('__newindex table with own metatable', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -445,7 +446,7 @@ test('binary __xxx functions in metatable', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -499,7 +500,7 @@ test('__eq', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -539,7 +540,7 @@ test('__lt', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -579,7 +580,7 @@ test('__le', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -619,7 +620,7 @@ test('__le that uses __lt', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -663,7 +664,7 @@ test('__unm, __bnot', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -671,13 +672,13 @@ test('__unm, __bnot', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "world", "Program output is correct" ); t.strictEqual( - lapi.lua_tostring(L, -2), + lapi.lua_tojsstring(L, -2), "hello", "Program output is correct" ); @@ -710,7 +711,7 @@ test('__len', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -718,7 +719,7 @@ test('__len', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -751,7 +752,7 @@ test('__concat', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -759,7 +760,7 @@ test('__concat', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -792,7 +793,7 @@ test('__call', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, null, bc, "test", "binary"); + lapi.lua_load(L, null, bc, lua.to_luastring("test"), lua.to_luastring("binary")); }, "Bytecode parsed without errors"); t.doesNotThrow(function () { @@ -804,4 +805,4 @@ test('__call', function (t) { ["hello", "world", "wow"], "Program output is correct" ); -}); \ No newline at end of file +}); diff --git a/tests/lutf8lib.js b/tests/lutf8lib.js index 38d8f8a..7832bae 100644 --- a/tests/lutf8lib.js +++ b/tests/lutf8lib.js @@ -107,7 +107,7 @@ test('utf8.char', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "( ͡° ͜ʖ ͡° )", "Correct element(s) on the stack" ); @@ -176,9 +176,9 @@ test('utf8.codes', function (t) { }, "Lua program ran without error"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "[1,40] [2,32] [3,865] [5,176] [7,32] [8,860] [10,662] [12,32] [13,865] [15,176] [17,32] [18,41] ", "Correct element(s) on the stack" ); -}); \ No newline at end of file +}); diff --git a/tests/lvm.js b/tests/lvm.js index 69195d1..bda4c4f 100644 --- a/tests/lvm.js +++ b/tests/lvm.js @@ -26,7 +26,7 @@ test('LOADK, RETURN', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Program output is correct" ); @@ -50,7 +50,7 @@ test('MOVE', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello world", "Program output is correct" ); @@ -328,7 +328,7 @@ test('TESTSET (and)', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -353,7 +353,7 @@ test('TESTSET (or)', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -382,7 +382,7 @@ test('TEST (true)', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -411,7 +411,7 @@ test('TEST (false)', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "goodbye", "Program output is correct" ); @@ -532,7 +532,7 @@ test('SETUPVAL, GETUPVAL', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "world", "Program output is correct" ); @@ -594,7 +594,7 @@ test('SELF', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello", "Program output is correct" ); @@ -794,8 +794,8 @@ test('CONCAT', function (t) { }, "Program executed without errors"); t.strictEqual( - lapi.lua_tostring(L, -1), + lapi.lua_tojsstring(L, -1), "hello 2 you", "Program output is correct" ); -}); \ No newline at end of file +}); -- cgit v1.2.3-70-g09d2