From 83b8e8660afdd6ab1afd5af42814cb106899af15 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 14:50:59 +0100 Subject: [PATCH 01/11] Use tstl/lua-wasm-bindings instead of fengari --- jest.config.js | 2 +- package-lock.json | 23 ++- package.json | 1 + test/tsconfig.json | 1 - test/types/fengari.d.ts | 347 ---------------------------------------- test/util.ts | 48 ++---- 6 files changed, 35 insertions(+), 387 deletions(-) delete mode 100644 test/types/fengari.d.ts diff --git a/jest.config.js b/jest.config.js index 09d82545f..2d390c93d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -17,7 +17,7 @@ module.exports = { preset: "ts-jest", globals: { "ts-jest": { - tsConfig: "/test/tsconfig.json", + tsconfig: "/test/tsconfig.json", diagnostics: { warnOnly: !isCI }, }, }, diff --git a/package-lock.json b/package-lock.json index 4791e9650..534e97209 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "jest": "^26.0.1", "jest-circus": "^25.1.0", "lua-types": "^2.8.0", + "lua-wasm-bindings": "^0.1.4", "prettier": "^2.0.5", "ts-jest": "^26.3.0", "ts-node": "^8.6.2" @@ -1460,7 +1461,6 @@ "jest-resolve": "^26.0.1", "jest-util": "^26.0.1", "jest-worker": "^26.0.0", - "node-notifier": "^7.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -3568,8 +3568,7 @@ "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "optionator": "^0.8.1" }, "bin": { "escodegen": "bin/escodegen.js", @@ -6219,7 +6218,6 @@ "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-serializer": "^26.0.0", "jest-util": "^26.0.1", @@ -8808,6 +8806,12 @@ "integrity": "sha512-FJY32giHIqD/XW1XGkJnl8XotXIJsJ2M42fj9A2UudttWA6orJioToW1OpgPdayTr+S1/oTO7i+hfBY3UVG8Fg==", "dev": true }, + "node_modules/lua-wasm-bindings": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/lua-wasm-bindings/-/lua-wasm-bindings-0.1.4.tgz", + "integrity": "sha512-Hos8hbdj7YJCOyiPN1ApsFMLZylyoaGA6J5J40zzGGRz+bcz8Ui7ocI3iwOLJJC1lEBbNA8wchV9i+PyRq2SYg==", + "dev": true + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -10564,6 +10568,11 @@ "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, "engines": { "node": ">=0.10.0" } @@ -18856,6 +18865,12 @@ "integrity": "sha512-FJY32giHIqD/XW1XGkJnl8XotXIJsJ2M42fj9A2UudttWA6orJioToW1OpgPdayTr+S1/oTO7i+hfBY3UVG8Fg==", "dev": true }, + "lua-wasm-bindings": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/lua-wasm-bindings/-/lua-wasm-bindings-0.1.4.tgz", + "integrity": "sha512-Hos8hbdj7YJCOyiPN1ApsFMLZylyoaGA6J5J40zzGGRz+bcz8Ui7ocI3iwOLJJC1lEBbNA8wchV9i+PyRq2SYg==", + "dev": true + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", diff --git a/package.json b/package.json index 078637493..a22093f39 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "jest": "^26.0.1", "jest-circus": "^25.1.0", "lua-types": "^2.8.0", + "lua-wasm-bindings": "^0.1.4", "prettier": "^2.0.5", "ts-jest": "^26.3.0", "ts-node": "^8.6.2" diff --git a/test/tsconfig.json b/test/tsconfig.json index 2c06244c7..b7d1b714b 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -4,7 +4,6 @@ "rootDir": "..", "types": ["node", "jest"], "baseUrl": ".", - "paths": { "*": ["types/*"] } }, "include": [".", "../src"], "exclude": [ diff --git a/test/types/fengari.d.ts b/test/types/fengari.d.ts deleted file mode 100644 index 8b13b169d..000000000 --- a/test/types/fengari.d.ts +++ /dev/null @@ -1,347 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention, @typescript-eslint/explicit-member-accessibility, @typescript-eslint/class-name-casing */ - -export const FENGARI_AUTHORS: string; -export const FENGARI_COPYRIGHT: string; -export const FENGARI_RELEASE: string; -export const FENGARI_VERSION: string; -export const FENGARI_VERSION_MAJOR: string; -export const FENGARI_VERSION_MINOR: string; -export const FENGARI_VERSION_NUM: number; -export const FENGARI_VERSION_RELEASE: string; -export namespace lauxlib { - const LUA_ERRFILE: number; - const LUA_FILEHANDLE: Uint8Array; - const LUA_LOADED_TABLE: Uint8Array; - const LUA_NOREF: number; - const LUA_PRELOAD_TABLE: Uint8Array; - const LUA_REFNIL: number; - class luaL_Buffer { - L: any; - b: any; - n: any; - } - function luaL_addchar(B: any, c: any): void; - function luaL_addlstring(B: any, s: any, l: any): void; - function luaL_addsize(B: any, s: any): void; - function luaL_addstring(B: any, s: any): void; - function luaL_addvalue(B: any): void; - function luaL_argcheck(L: any, cond: any, arg: any, extramsg: any): void; - function luaL_argerror(L: any, arg: any, extramsg: any): any; - function luaL_buffinit(L: any, B: any): void; - function luaL_buffinitsize(L: any, B: any, sz: any): any; - function luaL_callmeta(L: any, obj: any, event: any): any; - function luaL_checkany(L: any, arg: any): void; - function luaL_checkinteger(L: any, arg: any): any; - function luaL_checklstring(L: any, arg: any): any; - function luaL_checknumber(L: any, arg: any): any; - function luaL_checkoption(L: any, arg: any, def: any, lst: any): any; - function luaL_checkstack(L: any, space: any, msg: any): void; - function luaL_checkstring(L: any, arg: any): any; - function luaL_checktype(L: any, arg: any, t: any): void; - function luaL_checkudata(L: any, ud: any, tname: any): any; - function luaL_checkversion(L: any): void; - function luaL_checkversion_(L: any, ver: any, sz: any): void; - function luaL_dofile(L: any, filename: any): any; - function luaL_dostring(L: any, s: any): any; - function luaL_error(L: any, fmt: any, argp: any): any; - function luaL_execresult(L: any, e: any): any; - function luaL_fileresult(L: any, stat: any, fname: any, e: any): any; - function luaL_getmetafield(L: any, obj: any, event: any): any; - function luaL_getmetatable(L: any, n: any): any; - function luaL_getsubtable(L: any, idx: any, fname: any): any; - function luaL_gsub(L: any, s: any, p: any, r: any): any; - function luaL_len(L: any, idx: any): any; - function luaL_loadbuffer(L: any, s: any, sz: any, n: any): any; - function luaL_loadbufferx(L: any, buff: any, size: any, name: any, mode: any): any; - function luaL_loadfile(L: any, filename: any): any; - function luaL_loadfilex(L: any, filename: any, mode: any): any; - function luaL_loadstring(L: any, s: any): any; - function luaL_newlib(L: any, l: any): void; - function luaL_newlibtable(L: any): void; - function luaL_newmetatable(L: any, tname: any): any; - function luaL_newstate(): any; - function luaL_opt(L: any, f: any, n: any, d: any): any; - function luaL_optinteger(L: any, arg: any, def: any): any; - function luaL_optlstring(L: any, arg: any, def: any): any; - function luaL_optnumber(L: any, arg: any, def: any): any; - function luaL_optstring(L: any, arg: any, def: any): any; - function luaL_prepbuffer(B: any): any; - function luaL_prepbuffsize(B: any, sz: any): any; - function luaL_pushresult(B: any): void; - function luaL_pushresultsize(B: any, sz: any): void; - function luaL_ref(L: any, t: any): any; - function luaL_requiref(L: any, modname: any, openf: any, glb: any): void; - function luaL_setfuncs(L: any, l: any, nup: any): void; - function luaL_setmetatable(L: any, tname: any): void; - function luaL_testudata(L: any, ud: any, tname: any): any; - function luaL_tolstring(L: any, idx: any): any; - function luaL_traceback(L: any, L1: any, msg: any, level: any): void; - function luaL_typename(L: any, i: any): any; - function luaL_unref(L: any, t: any, ref: any): void; - function luaL_where(L: any, level: any): void; - function lua_writestringerror(...args: any[]): void; -} -export namespace lua { - const LUA_AUTHORS: string; - const LUA_COPYRIGHT: string; - const LUA_ERRERR: number; - const LUA_ERRGCMM: number; - const LUA_ERRMEM: number; - const LUA_ERRRUN: number; - const LUA_ERRSYNTAX: number; - const LUA_HOOKCALL: number; - const LUA_HOOKCOUNT: number; - const LUA_HOOKLINE: number; - const LUA_HOOKRET: number; - const LUA_HOOKTAILCALL: number; - const LUA_MASKCALL: number; - const LUA_MASKCOUNT: number; - const LUA_MASKLINE: number; - const LUA_MASKRET: number; - const LUA_MINSTACK: number; - const LUA_MULTRET: number; - const LUA_NUMTAGS: number; - const LUA_OK: number; - const LUA_OPADD: number; - const LUA_OPBAND: number; - const LUA_OPBNOT: number; - const LUA_OPBOR: number; - const LUA_OPBXOR: number; - const LUA_OPDIV: number; - const LUA_OPEQ: number; - const LUA_OPIDIV: number; - const LUA_OPLE: number; - const LUA_OPLT: number; - const LUA_OPMOD: number; - const LUA_OPMUL: number; - const LUA_OPPOW: number; - const LUA_OPSHL: number; - const LUA_OPSHR: number; - const LUA_OPSUB: number; - const LUA_OPUNM: number; - const LUA_REGISTRYINDEX: number; - const LUA_RELEASE: string; - const LUA_RIDX_GLOBALS: number; - const LUA_RIDX_LAST: number; - const LUA_RIDX_MAINTHREAD: number; - const LUA_SIGNATURE: Uint8Array; - const LUA_TBOOLEAN: number; - const LUA_TFUNCTION: number; - const LUA_TLIGHTUSERDATA: number; - const LUA_TNIL: number; - const LUA_TNONE: number; - const LUA_TNUMBER: number; - const LUA_TSTRING: number; - const LUA_TTABLE: number; - const LUA_TTHREAD: number; - const LUA_TUSERDATA: number; - const LUA_VERSION: string; - const LUA_VERSION_MAJOR: string; - const LUA_VERSION_MINOR: string; - const LUA_VERSION_NUM: number; - const LUA_VERSION_RELEASE: string; - const LUA_YIELD: number; - class lua_Debug { - event: any; - name: any; - namewhat: any; - what: any; - source: any; - currentline: any; - linedefined: any; - lastlinedefined: any; - nups: any; - nparams: any; - isvararg: any; - istailcall: any; - short_src: any; - i_ci: any; - } - function lua_absindex(L: any, idx: any): any; - function lua_arith(L: any, op: any): void; - function lua_atnativeerror(L: any, errorf: any): any; - function lua_atpanic(L: any, panicf: any): any; - function lua_call(L: any, n: any, r: any): void; - function lua_callk(L: any, nargs: any, nresults: any, ctx: any, k: any): void; - function lua_checkstack(L: any, n: any): any; - function lua_close(L: any): void; - function lua_compare(L: any, index1: any, index2: any, op: any): any; - function lua_concat(L: any, n: any): void; - function lua_copy(L: any, fromidx: any, toidx: any): void; - function lua_createtable(L: any, narray: any, nrec: any): void; - function lua_dump(L: any, writer: any, data: any, strip: any): any; - function lua_error(L: any): void; - function lua_gc(): void; - function lua_getallocf(): any; - function lua_getextraspace(): any; - function lua_getfield(L: any, idx: any, k: any): any; - function lua_getglobal(L: any, name: any): any; - function lua_gethook(L: any): any; - function lua_gethookcount(L: any): any; - function lua_gethookmask(L: any): any; - function lua_geti(L: any, idx: any, n: any): any; - function lua_getinfo(L: any, what: any, ar: any): any; - function lua_getlocal(L: any, ar: any, n: any): any; - function lua_getmetatable(L: any, objindex: any): any; - function lua_getstack(L: any, level: any, ar: any): any; - function lua_gettable(L: any, idx: any): any; - function lua_gettop(L: any): any; - function lua_getupvalue(L: any, funcindex: any, n: any): any; - function lua_getuservalue(L: any, idx: any): any; - function lua_insert(L: any, idx: any): void; - function lua_isboolean(L: any, n: any): any; - function lua_iscfunction(L: any, idx: any): any; - function lua_isfunction(L: any, idx: any): any; - function lua_isinteger(L: any, idx: any): any; - function lua_islightuserdata(L: any, idx: any): any; - function lua_isnil(L: any, n: any): any; - function lua_isnone(L: any, n: any): any; - function lua_isnoneornil(L: any, n: any): any; - function lua_isnumber(L: any, idx: any): any; - function lua_isproxy(p: any, L: any): any; - function lua_isstring(L: any, idx: any): any; - function lua_istable(L: any, idx: any): any; - function lua_isthread(L: any, idx: any): any; - function lua_isuserdata(L: any, idx: any): any; - function lua_isyieldable(L: any): any; - function lua_len(L: any, idx: any): void; - function lua_load(L: any, reader: any, data: any, chunkname: any, mode: any): any; - function lua_newstate(): any; - function lua_newtable(L: any): void; - function lua_newthread(L: any): any; - function lua_newuserdata(L: any, size: any): any; - function lua_next(L: any, idx: any): any; - function lua_pcall(L: any, n: any, r: any, f: any): any; - function lua_pcallk(L: any, nargs: any, nresults: any, errfunc: any, ctx: any, k: any): any; - function lua_pop(L: any, n: any): void; - function lua_pushboolean(L: any, b: any): void; - function lua_pushcclosure(L: any, fn: any, n: any): void; - function lua_pushcfunction(L: any, fn: any): void; - function lua_pushfstring(L: any, fmt: any, argp: any): any; - function lua_pushglobaltable(L: any): void; - function lua_pushinteger(L: any, n: any): void; - function lua_pushjsclosure(L: any, fn: any, n: any): void; - function lua_pushjsfunction(L: any, fn: any): void; - function lua_pushlightuserdata(L: any, p: any): void; - function lua_pushliteral(L: any, s: any): any; - function lua_pushlstring(L: any, s: any, len: any): any; - function lua_pushnil(L: any): void; - function lua_pushnumber(L: any, n: any): void; - function lua_pushstring(L: any, s: any): any; - function lua_pushthread(L: any): any; - function lua_pushvalue(L: any, idx: any): void; - function lua_pushvfstring(L: any, fmt: any, argp: any): any; - function lua_rawequal(L: any, index1: any, index2: any): any; - function lua_rawget(L: any, idx: any): any; - function lua_rawgeti(L: any, idx: any, n: any): any; - function lua_rawgetp(L: any, idx: any, p: any): any; - function lua_rawlen(L: any, idx: any): any; - function lua_rawset(L: any, idx: any): void; - function lua_rawseti(L: any, idx: any, n: any): void; - function lua_rawsetp(L: any, idx: any, p: any): void; - function lua_register(L: any, n: any, f: any): void; - function lua_remove(L: any, idx: any): void; - function lua_replace(L: any, idx: any): void; - function lua_resume(L: any, from: any, nargs: any): any; - function lua_rotate(L: any, idx: any, n: any): void; - const lua_setallof: any; - function lua_setfield(L: any, idx: any, k: any): void; - function lua_setglobal(L: any, name: any): void; - function lua_sethook(L: any, func: any, mask: any, count: any): void; - function lua_seti(L: any, idx: any, n: any): void; - function lua_setlocal(L: any, ar: any, n: any): any; - function lua_setmetatable(L: any, objindex: any): any; - function lua_settable(L: any, idx: any): void; - function lua_settop(L: any, idx: any): void; - function lua_setupvalue(L: any, funcindex: any, n: any): any; - function lua_setuservalue(L: any, idx: any): void; - function lua_status(L: any): any; - function lua_stringtonumber(L: any, s: any): any; - function lua_toboolean(L: any, idx: any): any; - function lua_tocfunction(L: any, idx: any): any; - function lua_todataview(L: any, idx: any): any; - function lua_tointeger(L: any, idx: any): any; - function lua_tointegerx(L: any, idx: any): any; - function lua_tojsstring(L: any, idx: any): any; - function lua_tolstring(L: any, idx: any): any; - function lua_tonumber(L: any, idx: any): any; - function lua_tonumberx(L: any, idx: any): any; - function lua_topointer(L: any, idx: any): any; - function lua_toproxy(L: any, idx: any): any; - function lua_tostring(L: any, idx: any): LuaString; - function lua_tothread(L: any, idx: any): any; - function lua_touserdata(L: any, idx: any): any; - function lua_type(L: any, idx: any): any; - function lua_typename(L: any, t: any): any; - function lua_upvalueid(L: any, fidx: any, n: any): any; - function lua_upvalueindex(i: any): any; - function lua_upvaluejoin(L: any, fidx1: any, n1: any, fidx2: any, n2: any): void; - function lua_version(L: any): any; - function lua_xmove(from: any, to: any, n: any): void; - function lua_yield(L: any, n: any): void; - function lua_yieldk(L: any, nresults: any, ctx: any, k: any): any; -} -export namespace luaconf { - const LUAI_MAXSTACK: number; - const LUAL_BUFFERSIZE: number; - const LUA_COMPAT_FLOATSTRING: boolean; - const LUA_DIRSEP: string; - const LUA_EXEC_DIR: string; - const LUA_IDSIZE: number; - const LUA_INTEGER_FMT: string; - const LUA_INTEGER_FRMLEN: string; - const LUA_JSDIR: string; - const LUA_JSPATH_DEFAULT: Uint8Array; - const LUA_LDIR: string; - const LUA_MAXINTEGER: number; - const LUA_MININTEGER: number; - const LUA_NUMBER_FMT: string; - const LUA_NUMBER_FRMLEN: string; - const LUA_PATH_DEFAULT: Uint8Array; - const LUA_PATH_MARK: string; - const LUA_PATH_SEP: string; - const LUA_SHRDIR: string; - const LUA_VDIR: string; - function frexp(value: any): any; - function ldexp(mantissa: any, exponent: any): any; - function lua_getlocaledecpoint(): any; - function lua_integer2str(n: any): any; - function lua_number2str(n: any): any; - function lua_numbertointeger(n: any): any; - function luai_apicheck(l: any, e: any): void; -} -export namespace lualib { - const LUA_BITLIBNAME: string; - const LUA_COLIBNAME: string; - const LUA_DBLIBNAME: string; - const LUA_FENGARILIBNAME: string; - const LUA_IOLIBNAME: string; - const LUA_LOADLIBNAME: string; - const LUA_MATHLIBNAME: string; - const LUA_OSLIBNAME: string; - const LUA_STRLIBNAME: string; - const LUA_TABLIBNAME: string; - const LUA_UTF8LIBNAME: string; - const LUA_VERSUFFIX: string; - function luaL_openlibs(L: any): void; - function lua_assert(c: any): void; - function luaopen_coroutine(L: any): any; - function luaopen_debug(L: any): any; - function luaopen_fengari(L: any): any; - function luaopen_io(L: any): any; - function luaopen_math(L: any): any; - function luaopen_os(L: any): any; - function luaopen_package(L: any): any; - function luaopen_string(L: any): any; - function luaopen_table(L: any): any; - function luaopen_utf8(L: any): any; -} - -export type LuaString = number[]; - -export function luastring_eq(a: any, b: any): any; -export function luastring_indexOf(s: any, v: any, i: any): any; -export function luastring_of(): any; -export function to_jsstring(value: LuaString, from?: any, to?: any, replacement_char?: any): string; -export function to_luastring(str: string, cache?: any): LuaString; -export function to_uristring(a: any): any; diff --git a/test/util.ts b/test/util.ts index 67cfcef57..e3f30a0a4 100644 --- a/test/util.ts +++ b/test/util.ts @@ -1,6 +1,7 @@ /* eslint-disable jest/no-standalone-expect */ import * as nativeAssert from "assert"; -import { lauxlib, lua, lualib, to_jsstring, to_luastring } from "fengari"; +import { lauxlib, lua, lualib } from "lua-wasm-bindings/dist/lua.54"; +import { LUA_OK } from "lua-wasm-bindings/dist/lua"; import * as fs from "fs"; import { stringify } from "javascript-stringify"; import * as path from "path"; @@ -10,32 +11,8 @@ import * as vm from "vm"; import * as tstl from "../src"; import { createEmitOutputCollector } from "../src/transpilation/output-collector"; -export function toByteCode(luaCode: string) { - const L = lauxlib.luaL_newstate(); - - if (lauxlib.luaL_loadstring(L, to_luastring(luaCode)) !== lua.LUA_OK) throw Error(lua.lua_tojsstring(L, -1)); - - const writer = (_: any, newBytes: Uint8Array, size: number, data: number[]) => { - data.push(...newBytes.slice(0, size)); - return 0; - }; - - const data: number[] = []; - - const dumpExitCode = lua.lua_dump(L, writer, data, false); - - if (dumpExitCode !== 0) { - throw Error("Unable to dump byte code"); - } - - return Uint8Array.from(data); -} - const jsonLib = fs.readFileSync(path.join(__dirname, "json.lua"), "utf8"); -const jsonLibByteCode = toByteCode(jsonLib); - const luaLib = fs.readFileSync(path.resolve(__dirname, "../dist/lualib/lualib_bundle.lua"), "utf8"); -const luaLibByteCode = toByteCode(luaLib); // Using `test` directly makes eslint-plugin-jest consider this file as a test const defineTest = test; @@ -369,7 +346,7 @@ export abstract class TestBuilder { // Json lua.lua_getglobal(L, "package"); lua.lua_getfield(L, -1, "preload"); - lauxlib.luaL_loadstring(L, jsonLibByteCode); + lauxlib.luaL_loadstring(L, jsonLib); lua.lua_setfield(L, -2, "json"); // Lua lib if ( @@ -378,7 +355,7 @@ export abstract class TestBuilder { ) { lua.lua_getglobal(L, "package"); lua.lua_getfield(L, -1, "preload"); - lauxlib.luaL_loadstring(L, luaLibByteCode); + lauxlib.luaL_loadstring(L, luaLib); lua.lua_setfield(L, -2, "lualib_bundle"); } @@ -392,7 +369,7 @@ export abstract class TestBuilder { if (transpiledExtraFile?.lua) { lua.lua_getglobal(L, "package"); lua.lua_getfield(L, -1, "preload"); - lauxlib.luaL_loadstring(L, to_luastring(transpiledExtraFile.lua)); + lauxlib.luaL_loadstring(L, transpiledExtraFile.lua); lua.lua_setfield(L, -2, fileName.replace(".ts", "")); } }); @@ -404,20 +381,23 @@ return JSON.stringify((function() ${this.getLuaCodeWithWrapper(mainFile)} end)());`; - const status = lauxlib.luaL_dostring(L, to_luastring(wrappedMainCode)); + const status = lauxlib.luaL_dostring(L, wrappedMainCode); - if (status === lua.LUA_OK) { + if (status === LUA_OK) { if (lua.lua_isstring(L, -1)) { - const result = eval(`(${lua.lua_tojsstring(L, -1)})`); + const result = eval(`(${lua.lua_tostring(L, -1)})`); + lua.lua_close(L); return result === null ? undefined : result; } else { - const returnType = to_jsstring(lua.lua_typename(L, lua.lua_type(L, -1))); + const returnType = lua.lua_typename(L, lua.lua_type(L, -1)); + lua.lua_close(L); throw new Error(`Unsupported Lua return type: ${returnType}`); } } else { // Filter out control characters appearing on some systems - const luaStackString = lua.lua_tostring(L, -1).filter(c => c >= 20); - const message = to_jsstring(luaStackString).replace(/^\[string "(--)?\.\.\."\]:\d+: /, ""); + const luaStackString = lua.lua_tostring(L, -1)// TODO .filter(c => c >= 20); + const message = luaStackString.replace(/^\[string "(--)?\.\.\."\]:\d+: /, ""); + lua.lua_close(L); return new ExecutionError(message); } } From b9bd8a8db32538ec093480858efd690c2dfd41e1 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 14:57:10 +0100 Subject: [PATCH 02/11] Removed extra comma --- test/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tsconfig.json b/test/tsconfig.json index b7d1b714b..86d7c9359 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "rootDir": "..", "types": ["node", "jest"], - "baseUrl": ".", + "baseUrl": "." }, "include": [".", "../src"], "exclude": [ From 8e43cf0710d9c84acdf7e8349f33857f7460f224 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 14:57:22 +0100 Subject: [PATCH 03/11] Added missing semicolon --- test/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/util.ts b/test/util.ts index e3f30a0a4..c85980417 100644 --- a/test/util.ts +++ b/test/util.ts @@ -395,7 +395,7 @@ end)());`; } } else { // Filter out control characters appearing on some systems - const luaStackString = lua.lua_tostring(L, -1)// TODO .filter(c => c >= 20); + const luaStackString = lua.lua_tostring(L, -1); // TODO .filter(c => c >= 20); const message = luaStackString.replace(/^\[string "(--)?\.\.\."\]:\d+: /, ""); lua.lua_close(L); return new ExecutionError(message); From 43edaf129a40627ca570bb6661dea1b6b1fb8ec5 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 16:27:36 +0100 Subject: [PATCH 04/11] Fix an issue with Lua json encoder not detecting actual Lua Ininfity / NaN --- package.json | 1 - test/json.lua | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index a22093f39..573394f5a 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,6 @@ "eslint": "^6.8.0", "eslint-plugin-import": "^2.20.1", "eslint-plugin-jest": "^23.8.2", - "fengari": "^0.1.4", "fs-extra": "^8.1.0", "javascript-stringify": "^2.0.1", "jest": "^26.0.1", diff --git a/test/json.lua b/test/json.lua index cd345c9b4..e2246f1dc 100644 --- a/test/json.lua +++ b/test/json.lua @@ -112,11 +112,11 @@ end local function encode_number(val) - if val ~= val then + if tostring(val) == tostring(0/0) then return "NaN" - elseif val == math.huge then + elseif val == math.huge or val == 1/0 then return "Infinity" - elseif val == -math.huge then + elseif val == -math.huge or -val == 1/0 then return "-Infinity" else return string.format("%.17g", val) From f510896aafa0664d19e0673f0110a549d3ae92b1 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 17:51:37 +0100 Subject: [PATCH 05/11] Fixed test cases Most of the tests failed due to incorrect iteration order And unexpected JS/Lua differences --- test/json.lua | 4 ++-- test/unit/builtins/array.spec.ts | 11 ++++++++++- test/unit/builtins/numbers.spec.ts | 14 ++++++++++++-- test/unit/builtins/object.spec.ts | 12 +++++++++--- test/unit/loops.spec.ts | 17 ++++++++++++----- 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/test/json.lua b/test/json.lua index e2246f1dc..0e7968da1 100644 --- a/test/json.lua +++ b/test/json.lua @@ -114,9 +114,9 @@ end local function encode_number(val) if tostring(val) == tostring(0/0) then return "NaN" - elseif val == math.huge or val == 1/0 then + elseif val == math.huge then return "Infinity" - elseif val == -math.huge or -val == 1/0 then + elseif val == -math.huge then return "-Infinity" else return string.format("%.17g", val) diff --git a/test/unit/builtins/array.spec.ts b/test/unit/builtins/array.spec.ts index 584f686bb..770387aea 100644 --- a/test/unit/builtins/array.spec.ts +++ b/test/unit/builtins/array.spec.ts @@ -160,12 +160,21 @@ describe("array.length", () => { util.testExpression`[1, 2, 3].length = ${length}`.expectToEqual(length); }); - test.each([-1, -7, 0.1, NaN, Infinity, -Infinity])("throws on invalid values (%p)", length => { + test.each([-1, -7, 0.1])("throws on invalid values (%p)", length => { util.testFunction` [1, 2, 3].length = ${length}; `.expectToEqual(new util.ExecutionError(`invalid array length: ${length}`)); }); + test.each([NaN, Infinity, -Infinity])("throws on invalid special values (%p)", length => { + // Need to get the actual lua tostring version of inf/nan + // this is platform dependent so we can/should not hardcode it + const luaSpecialValueString = util.testExpression`(${length}).toString()`.getLuaExecutionResult(); + util.testFunction` + [1, 2, 3].length = ${length}; + `.expectToEqual(new util.ExecutionError(`invalid array length: ${luaSpecialValueString}`)); + }); + test("in array destructuring", () => { util.testFunction` const array = [0, 1, 2]; diff --git a/test/unit/builtins/numbers.spec.ts b/test/unit/builtins/numbers.spec.ts index 0ae65efb3..eb8b26307 100644 --- a/test/unit/builtins/numbers.spec.ts +++ b/test/unit/builtins/numbers.spec.ts @@ -1,3 +1,4 @@ +import { lua } from "lua-wasm-bindings/dist/lua.54"; import * as util from "../../util"; test.each([ @@ -56,8 +57,17 @@ test.each(toStringPairs)("(%p).toString(%p)", (value, radix) => { util.testExpressionTemplate`(${value}).toString(${radix})`.expectToMatchJsResult(); }); -test.each([NaN, Infinity, -Infinity])("%p.toString(2)", value => { - util.testExpressionTemplate`(${value}).toString(2)`.expectToMatchJsResult(); +test.each([ + [NaN, "(0/0)"], + [Infinity, "(1/0)"], + [-Infinity, "(-(1/0))"], +])("%p.toString(2)", (value, luaNativeSpecialNum) => { + // Need to get the actual lua tostring version of inf/nan + // this is platform dependent so we can/should not hardcode it + const luaNativeSpecialNumString = util.testExpression`${luaNativeSpecialNum}.toString()`.getLuaExecutionResult(); + // Cannot use expectToMatchJsResult because this actually wont be the same in JS in Lua + // TODO fix this in lualib/NumberToString.ts + util.testExpressionTemplate`(${value}).toString(2)`.expectToEqual(luaNativeSpecialNumString); }); test.each(cases)("isNaN(%p)", value => { diff --git a/test/unit/builtins/object.spec.ts b/test/unit/builtins/object.spec.ts index cc7e380d6..4c5842737 100644 --- a/test/unit/builtins/object.spec.ts +++ b/test/unit/builtins/object.spec.ts @@ -11,15 +11,21 @@ test.each([ }); test.each([{}, { abc: 3 }, { abc: 3, def: "xyz" }])("Object.entries (%p)", obj => { - util.testExpressionTemplate`Object.entries(${obj})`.expectToMatchJsResult(); + const testBuilder = util.testExpressionTemplate`Object.entries(${obj})`; + // Need custom matcher because order is not guaranteed in neither JS nor Lua + expect(testBuilder.getJsExecutionResult()).toEqual(expect.arrayContaining(testBuilder.getLuaExecutionResult())); }); test.each([{}, { abc: 3 }, { abc: 3, def: "xyz" }])("Object.keys (%p)", obj => { - util.testExpressionTemplate`Object.keys(${obj})`.expectToMatchJsResult(); + const testBuilder = util.testExpressionTemplate`Object.keys(${obj})`; + // Need custom matcher because order is not guaranteed in neither JS nor Lua + expect(testBuilder.getJsExecutionResult()).toEqual(expect.arrayContaining(testBuilder.getLuaExecutionResult())); }); test.each([{}, { abc: "def" }, { abc: 3, def: "xyz" }])("Object.values (%p)", obj => { - util.testExpressionTemplate`Object.values(${obj})`.expectToMatchJsResult(); + const testBuilder = util.testExpressionTemplate`Object.values(${obj})`; + // Need custom matcher because order is not guaranteed in neither JS nor Lua + expect(testBuilder.getJsExecutionResult()).toEqual(expect.arrayContaining(testBuilder.getLuaExecutionResult())); }); test.each(["[]", '[["a", 1], ["b", 2]]', '[["a", 1], ["a", 2]]', 'new Map([["foo", "bar"]])'])( diff --git a/test/unit/loops.spec.ts b/test/unit/loops.spec.ts index c644776e5..8e1acab7e 100644 --- a/test/unit/loops.spec.ts +++ b/test/unit/loops.spec.ts @@ -573,7 +573,7 @@ test("do...while double-negation", () => { }); test("for...in with pre-defined variable", () => { - util.testFunction` + const testBuilder = util.testFunction` const obj = { x: "y", foo: "bar" }; let x = ""; @@ -582,16 +582,23 @@ test("for...in with pre-defined variable", () => { result.push(x); } return result; - `.expectToMatchJsResult(); + `; + // Need custom matcher because order is not guaranteed in neither JS nor Lua + expect(testBuilder.getJsExecutionResult()).toEqual(expect.arrayContaining(testBuilder.getLuaExecutionResult())); }); test("for...in with pre-defined variable keeps last value", () => { - util.testFunction` - const obj = { x: "y", foo: "bar" }; + const keyX = "x"; + const keyFoo = "foo"; + + const result = util.testFunction` + const obj = { x: "${keyX}", foo: "${keyFoo}" }; let x = ""; for (x in obj) { } return x; - `.expectToMatchJsResult(); + `.getLuaExecutionResult(); + // Need custom matcher because order is not guaranteed in neither JS nor Lua + expect([keyX, keyFoo]).toContain(result); }); From 8ae2d9d6cce2d5242d6e314268c5ba27f68cca35 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 17:53:01 +0100 Subject: [PATCH 06/11] Removed fengari from lockfile --- package-lock.json | 50 ----------------------------------------------- 1 file changed, 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index 534e97209..59d842844 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,6 @@ "eslint": "^6.8.0", "eslint-plugin-import": "^2.20.1", "eslint-plugin-jest": "^23.8.2", - "fengari": "^0.1.4", "fs-extra": "^8.1.0", "javascript-stringify": "^2.0.1", "jest": "^26.0.1", @@ -4438,17 +4437,6 @@ "bser": "2.1.1" } }, - "node_modules/fengari": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fengari/-/fengari-0.1.4.tgz", - "integrity": "sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==", - "dev": true, - "dependencies": { - "readline-sync": "^1.4.9", - "sprintf-js": "^1.1.1", - "tmp": "^0.0.33" - } - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -9672,15 +9660,6 @@ "node": ">=4" } }, - "node_modules/readline-sync": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.9.tgz", - "integrity": "sha1-PtqOZfI80qF+YTAbHwADOWr17No=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", @@ -10546,12 +10525,6 @@ "node": ">=0.10.0" } }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -15327,17 +15300,6 @@ "bser": "2.1.1" } }, - "fengari": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fengari/-/fengari-0.1.4.tgz", - "integrity": "sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==", - "dev": true, - "requires": { - "readline-sync": "^1.4.9", - "sprintf-js": "^1.1.1", - "tmp": "^0.0.33" - } - }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -19543,12 +19505,6 @@ } } }, - "readline-sync": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.9.tgz", - "integrity": "sha1-PtqOZfI80qF+YTAbHwADOWr17No=", - "dev": true - }, "realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", @@ -20269,12 +20225,6 @@ "extend-shallow": "^3.0.0" } }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", From 0c0164f8abaf47f8d47ad7576ad684fd2c08749d Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 17:55:44 +0100 Subject: [PATCH 07/11] Revert NaN change --- test/json.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/json.lua b/test/json.lua index 0e7968da1..cd345c9b4 100644 --- a/test/json.lua +++ b/test/json.lua @@ -112,7 +112,7 @@ end local function encode_number(val) - if tostring(val) == tostring(0/0) then + if val ~= val then return "NaN" elseif val == math.huge then return "Infinity" From c34ca4d56755bc19dcb5ff57ae58918bef91e37f Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 17:57:47 +0100 Subject: [PATCH 08/11] Removed unused import --- test/unit/builtins/numbers.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/builtins/numbers.spec.ts b/test/unit/builtins/numbers.spec.ts index eb8b26307..f58209c31 100644 --- a/test/unit/builtins/numbers.spec.ts +++ b/test/unit/builtins/numbers.spec.ts @@ -1,4 +1,3 @@ -import { lua } from "lua-wasm-bindings/dist/lua.54"; import * as util from "../../util"; test.each([ From 45f85dbd5e3f21ea60de3eba9c7347cd90621595 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Wed, 3 Mar 2021 20:05:37 +0100 Subject: [PATCH 09/11] Fixed small mistake --- test/unit/loops.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/loops.spec.ts b/test/unit/loops.spec.ts index 8e1acab7e..8e9c22373 100644 --- a/test/unit/loops.spec.ts +++ b/test/unit/loops.spec.ts @@ -592,7 +592,7 @@ test("for...in with pre-defined variable keeps last value", () => { const keyFoo = "foo"; const result = util.testFunction` - const obj = { x: "${keyX}", foo: "${keyFoo}" }; + const obj = { ${keyX}: "y", ${keyFoo}: "bar" }; let x = ""; for (x in obj) { From cc34f8a16a1ab7a673583d41ce9373c453568c85 Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Thu, 4 Mar 2021 20:57:14 +0100 Subject: [PATCH 10/11] Change Lua vm version from 5.4 to 5.3 --- test/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/util.ts b/test/util.ts index c85980417..7d3559389 100644 --- a/test/util.ts +++ b/test/util.ts @@ -1,6 +1,6 @@ /* eslint-disable jest/no-standalone-expect */ import * as nativeAssert from "assert"; -import { lauxlib, lua, lualib } from "lua-wasm-bindings/dist/lua.54"; +import { lauxlib, lua, lualib } from "lua-wasm-bindings/dist/lua.53"; import { LUA_OK } from "lua-wasm-bindings/dist/lua"; import * as fs from "fs"; import { stringify } from "javascript-stringify"; From f94c40cc82653351aafd74265cefb205412ef7af Mon Sep 17 00:00:00 2001 From: Lorenz Junglas Date: Thu, 4 Mar 2021 21:04:49 +0100 Subject: [PATCH 11/11] Removed error filter comment and TODO --- test/util.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/util.ts b/test/util.ts index 7d3559389..a93b54995 100644 --- a/test/util.ts +++ b/test/util.ts @@ -394,8 +394,7 @@ end)());`; throw new Error(`Unsupported Lua return type: ${returnType}`); } } else { - // Filter out control characters appearing on some systems - const luaStackString = lua.lua_tostring(L, -1); // TODO .filter(c => c >= 20); + const luaStackString = lua.lua_tostring(L, -1); const message = luaStackString.replace(/^\[string "(--)?\.\.\."\]:\d+: /, ""); lua.lua_close(L); return new ExecutionError(message);