From d536b642a849e4eba1d5b23e0d4b1c05ab7152a0 Mon Sep 17 00:00:00 2001 From: FallenParadise Date: Sat, 5 Aug 2023 18:34:09 +0300 Subject: [PATCH 1/8] fix build on windows --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c2069f8..6bebbf6 100755 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "scripts": { "build:wasm:dev": "./build.sh dev", "build:wasm": "./build.sh", - "build:wasm:docker:dev": "docker run --rm -v $(pwd):/wasmoon emscripten/emsdk /wasmoon/build.sh dev", - "build:wasm:docker": "docker run --rm -v $(pwd):/wasmoon emscripten/emsdk /wasmoon/build.sh", + "build:wasm:docker:dev": "docker run --rm -v .:/wasmoon emscripten/emsdk /wasmoon/build.sh dev", + "build:wasm:docker": "docker run --rm -v .:/wasmoon emscripten/emsdk /wasmoon/build.sh", "start": "rollup -c -w", "test": "mocha --parallel --require ./test/boot.js test/*.test.js", "luatests": "node --experimental-import-meta-resolve test/luatests.mjs", From e3f0ef7caf615a64d3cf3b79da14bc3754bf93c2 Mon Sep 17 00:00:00 2001 From: FallenParadise Date: Sat, 5 Aug 2023 21:03:30 +0300 Subject: [PATCH 2/8] [WIP] : fixed multireturn from dostring --- src/engine.ts | 23 ++++++++++++++++------ src/type-extensions/function.ts | 25 ++++++++++++++--------- test/engine.test.js | 35 ++++++++++++++++++++++++++++++++- test/filesystem.test.js | 4 ++-- 4 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/engine.ts b/src/engine.ts index 0660bf0..05a8765 100755 --- a/src/engine.ts +++ b/src/engine.ts @@ -51,15 +51,11 @@ export default class LuaEngine { } public doStringSync(script: string): any { - this.global.loadString(script) - const result = this.global.runSync() - return result[0] + return this.callByteCodeSync((global) => global.loadString(script)) } public doFileSync(filename: string): any { - this.global.loadFile(filename) - const result = this.global.runSync() - return result[0] + return this.callByteCodeSync((global) => global.loadFile(filename)) } // WARNING: It will not wait for open handles and can potentially cause bugs if JS code tries to reference Lua after executed @@ -72,10 +68,25 @@ export default class LuaEngine { if (result.length > 0) { this.cmodule.lua_xmove(thread.address, this.global.address, result.length) } + + if (result.length > 1) { + return result // support for multi return values + } + return result[0] } finally { // Pop the read on success or failure this.global.remove(threadIndex) } } + + private callByteCodeSync(loader: (global: Global) => void): any { + const global = this.global + loader(global) + const result = global.runSync() + if (result.length > 1) { + return result // support for multi return values + } + return result[0] + } } diff --git a/src/type-extensions/function.ts b/src/type-extensions/function.ts index 5c0151c..a53d66d 100644 --- a/src/type-extensions/function.ts +++ b/src/type-extensions/function.ts @@ -1,5 +1,5 @@ import { BaseDecorationOptions, Decoration } from '../decoration' -import { LUA_REGISTRYINDEX, LuaReturn, LuaState, LuaType, PointerSize } from '../types' +import { LUA_MULTRET, LUA_REGISTRYINDEX, LuaReturn, LuaState, LuaType, PointerSize } from '../types' import Global from '../global' import MultiReturn from '../multireturn' import RawResult from '../raw-result' @@ -22,10 +22,10 @@ class FunctionTypeExtension extends TypeExtension { - if (!this.thread.isClosed()) { - this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) - } - }) + if (!this.thread.isClosed()) { + this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) + } + }) : undefined private gcPointer: number @@ -177,15 +177,22 @@ class FunctionTypeExtension extends TypeExtension 1) { + result = thread.getStackValues(deltaTop) + } else { + result = thread.getValue(-1) + } - const result = thread.getValue(-1) - - thread.pop() + thread.pop(deltaTop + 1) return result } diff --git a/test/engine.test.js b/test/engine.test.js index 084732b..dd4fd7e 100755 --- a/test/engine.test.js +++ b/test/engine.test.js @@ -168,13 +168,14 @@ describe('Engine', () => { expect(sum(10, 50)).to.be.equal(60) }) + // TEST OFTEN BREAKS it('scheduled lua calls should succeed', async () => { const engine = await getEngine() engine.global.set('setInterval', setInterval) await engine.doString(` test = "" - setInterval(function() + setInterval(function () test = test .. "i" end, 1) `) @@ -238,6 +239,38 @@ describe('Engine', () => { expect(returns.at(-1)).to.be.a('function') }) + it('doString with multiple returns should succeed', async () => { + const engine = await getEngine() + + const returns = await engine.doString(` + return 1, x, y, "Hello World", {}, function() end, {1,2,3}, {a = 1, b = 2, c = 3}; + `) + + expect(returns).to.be.a('array') + expect(returns).to.have.length(8) + expect(returns[5]).to.be.a('function') + expect(returns[6]).to.be.a('array') + expect(returns[7]).to.be.a('object') + }) + + it('call lua function with multiple returns should succeed', async () => { + const engine = await getEngine() + + const fn = await engine.doString(` + return function (x,y) + return 1, x, y, "Hello World", {}, function() end, {1,2,3}, {a = 1, b = 2, c = 3}; + end + `) + + expect(fn).to.be.a('function') + + const returns = fn(1, 2) + expect(returns).to.have.length(8) + expect(returns[5]).to.be.a('function') + expect(returns[6]).to.be.a('array') + expect(returns[7]).to.be.a('object') + }) + it('get a lua thread should succeed', async () => { const engine = await getEngine() diff --git a/test/filesystem.test.js b/test/filesystem.test.js index 92fe44f..415b149 100644 --- a/test/filesystem.test.js +++ b/test/filesystem.test.js @@ -17,7 +17,7 @@ describe('Filesystem', () => { await factory.mountFile('yolo/sofancy/test.lua', 'return 42') const engine = await factory.createEngine() - const value = await engine.doString('return require("yolo/sofancy/test")') + const [value] = await engine.doString('return require("yolo/sofancy/test")') expect(value).to.be.equal(42) }) @@ -27,7 +27,7 @@ describe('Filesystem', () => { await factory.mountFile('hello/init.lua', 'return 42') const engine = await factory.createEngine() - const value = await engine.doString('return require("hello")') + const [value] = await engine.doString('return require("hello")') expect(value).to.be.equal(42) }) From eb093148312e695d2c9d889d2c928eb9a6c30f99 Mon Sep 17 00:00:00 2001 From: FallenParadise Date: Tue, 8 Aug 2023 22:24:12 +0300 Subject: [PATCH 3/8] soft mulret fix --- src/type-extensions/function.ts | 13 ++++++------- test/engine.test.js | 16 +++++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/type-extensions/function.ts b/src/type-extensions/function.ts index a53d66d..e082424 100644 --- a/src/type-extensions/function.ts +++ b/src/type-extensions/function.ts @@ -158,7 +158,7 @@ class FunctionTypeExtension extends TypeExtension { + const jsFunc = (...args: any[]): MultiReturn | any => { if (thread.isClosed()) { console.warn('Tried to call a function after closing lua state') return @@ -177,22 +177,21 @@ class FunctionTypeExtension extends TypeExtension 1) { - result = thread.getStackValues(deltaTop) + result = thread.getStackValues(oldTop - 1) } else { result = thread.getValue(-1) } - - thread.pop(deltaTop + 1) + thread.pop(deltaTop) return result } diff --git a/test/engine.test.js b/test/engine.test.js index dd4fd7e..261e01a 100755 --- a/test/engine.test.js +++ b/test/engine.test.js @@ -257,18 +257,20 @@ describe('Engine', () => { const engine = await getEngine() const fn = await engine.doString(` - return function (x,y) - return 1, x, y, "Hello World", {}, function() end, {1,2,3}, {a = 1, b = 2, c = 3}; + return function () + -- return 1, x, y, "Hello World", {}, function() end; + return 1, x, y, function () end, {1,2,3}, {a = 1, b = 2}; end `) expect(fn).to.be.a('function') - const returns = fn(1, 2) - expect(returns).to.have.length(8) - expect(returns[5]).to.be.a('function') - expect(returns[6]).to.be.a('array') - expect(returns[7]).to.be.a('object') + const returns = fn() + const [func, arr, obj] = returns.slice(3) + expect(returns).to.have.length(6) + expect(func).to.be.a('function') + expect(arr).to.be.a('array') + expect(obj).to.be.a('object') }) it('get a lua thread should succeed', async () => { From 0feffdaf367a4cb11806c68aa744bfa45852c0f4 Mon Sep 17 00:00:00 2001 From: FallenParadise Date: Tue, 8 Aug 2023 22:32:46 +0300 Subject: [PATCH 4/8] add comments --- test/filesystem.test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/filesystem.test.js b/test/filesystem.test.js index 415b149..8ef3ce0 100644 --- a/test/filesystem.test.js +++ b/test/filesystem.test.js @@ -17,6 +17,7 @@ describe('Filesystem', () => { await factory.mountFile('yolo/sofancy/test.lua', 'return 42') const engine = await factory.createEngine() + // second parameter is path to module const [value] = await engine.doString('return require("yolo/sofancy/test")') expect(value).to.be.equal(42) @@ -27,6 +28,7 @@ describe('Filesystem', () => { await factory.mountFile('hello/init.lua', 'return 42') const engine = await factory.createEngine() + // second parameter is path to module const [value] = await engine.doString('return require("hello")') expect(value).to.be.equal(42) From d8494e5ceef003cbaf9cce153b8489ee450bd6d6 Mon Sep 17 00:00:00 2001 From: FallenParadise Date: Tue, 8 Aug 2023 23:08:57 +0300 Subject: [PATCH 5/8] fix bug with args. add tests --- src/type-extensions/function.ts | 3 ++- test/engine.test.js | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/type-extensions/function.ts b/src/type-extensions/function.ts index e082424..0f6f307 100644 --- a/src/type-extensions/function.ts +++ b/src/type-extensions/function.ts @@ -173,11 +173,12 @@ class FunctionTypeExtension extends TypeExtension { const engine = await getEngine() const fn = await engine.doString(` - return function () - -- return 1, x, y, "Hello World", {}, function() end; + return function (x, y) return 1, x, y, function () end, {1,2,3}, {a = 1, b = 2}; end `) expect(fn).to.be.a('function') - const returns = fn() + const returns = fn(4, 5) const [func, arr, obj] = returns.slice(3) expect(returns).to.have.length(6) expect(func).to.be.a('function') @@ -273,6 +272,21 @@ describe('Engine', () => { expect(obj).to.be.a('object') }) + it('call lua function with single returns array should succeed', async () => { + const engine = await getEngine() + + const fn = await engine.doString(` + return function (a, b, c) + return {a, b, c}; + end + `) + + expect(fn).to.be.a('function') + const array = fn(3, 4, 5) + expect(array).to.be.an('array') + expect(array).to.have.length(3) + }) + it('get a lua thread should succeed', async () => { const engine = await getEngine() From 6d816a0bc339e66bf6ec652cf89d843849edb735 Mon Sep 17 00:00:00 2001 From: FallenParadise Date: Fri, 11 Aug 2023 22:43:46 +0300 Subject: [PATCH 6/8] run 'npm run lint' command --- README.md | 2 +- src/type-extensions/function.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8b1f0c1..db7236c 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ module.exports = { child_process: false, crypto: false, url: false, - module: false + module: false, }, }, } diff --git a/src/type-extensions/function.ts b/src/type-extensions/function.ts index 0f6f307..8340d42 100644 --- a/src/type-extensions/function.ts +++ b/src/type-extensions/function.ts @@ -22,10 +22,10 @@ class FunctionTypeExtension extends TypeExtension { - if (!this.thread.isClosed()) { - this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) - } - }) + if (!this.thread.isClosed()) { + this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) + } + }) : undefined private gcPointer: number From 84601e870402b02986b7380a1d3fc1ebe2977b6f Mon Sep 17 00:00:00 2001 From: FallenParadise Date: Sat, 12 Aug 2023 17:36:49 +0300 Subject: [PATCH 7/8] change to wrapped `getTop()` --- src/type-extensions/function.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/type-extensions/function.ts b/src/type-extensions/function.ts index 8340d42..bc7782e 100644 --- a/src/type-extensions/function.ts +++ b/src/type-extensions/function.ts @@ -22,10 +22,10 @@ class FunctionTypeExtension extends TypeExtension { - if (!this.thread.isClosed()) { - this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) - } - }) + if (!this.thread.isClosed()) { + this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) + } + }) : undefined private gcPointer: number @@ -173,7 +173,7 @@ class FunctionTypeExtension extends TypeExtension Date: Sat, 12 Aug 2023 17:37:46 +0300 Subject: [PATCH 8/8] run `npm run lint` --- src/type-extensions/function.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/type-extensions/function.ts b/src/type-extensions/function.ts index bc7782e..f641451 100644 --- a/src/type-extensions/function.ts +++ b/src/type-extensions/function.ts @@ -22,10 +22,10 @@ class FunctionTypeExtension extends TypeExtension { - if (!this.thread.isClosed()) { - this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) - } - }) + if (!this.thread.isClosed()) { + this.thread.lua.luaL_unref(this.thread.address, LUA_REGISTRYINDEX, func) + } + }) : undefined private gcPointer: number