Skip to content

Commit d024aec

Browse files
committed
feat: support multiple return values from js-functions
1 parent 89020ca commit d024aec

2 files changed

Lines changed: 21 additions & 3 deletions

File tree

src/lua-state-context.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,7 @@ namespace {
617617
int top_index = lua_gettop(L);
618618

619619
std::vector<napi_value> js_args;
620+
js_args.reserve(top_index - 1);
620621
for (int i = 2; i <= top_index; ++i) {
621622
auto js_arg = ReadJsValueFromStack(L, env, i);
622623
js_args.push_back(js_arg);
@@ -625,9 +626,18 @@ namespace {
625626
// call js function
626627
Napi::Value js_function_result = js_function_holder->ref->Call(js_args);
627628

628-
PushJsValueToStack(L, js_function_result);
629-
630-
return 1;
629+
if (js_function_result.IsArray()) {
630+
Napi::Array js_function_results = js_function_result.As<Napi::Array>();
631+
uint32_t js_function_results_length = js_function_results.Length();
632+
for (uint32_t i = 0; i < js_function_results_length; ++i) {
633+
Napi::Value result = js_function_results.Get(i);
634+
PushJsValueToStack(L, result);
635+
}
636+
return js_function_results_length;
637+
} else {
638+
PushJsValueToStack(L, js_function_result);
639+
return 1;
640+
}
631641
}
632642

633643
int GcJsFunctionLuaCallback(lua_State* L) {

tests/lua-state.set-global.test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,13 @@ describe(`${LuaState.name}#${LuaState.prototype.setGlobal.name}`, () => {
133133
'should returns result',
134134
)
135135
})
136+
137+
it('should set function with multiple returns', () => {
138+
luaState.setGlobal('func', () => {
139+
return [1, 'foo']
140+
})
141+
luaState.eval(`r1, r2 = func()`)
142+
deepStrictEqual(luaState.eval(`return { r1, r2 }`), { 1: 1, 2: 'foo' })
143+
})
136144
})
137145
})

0 commit comments

Comments
 (0)