Skip to content

Commit

Permalink
fix boolean type passback and object conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
Doridian committed Dec 3, 2023
1 parent d0139dc commit 290a1b1
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 56 deletions.
1 change: 1 addition & 0 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ BINARY_ARGS=-s EXPORTED_FUNCTIONS="[\
'_lua_setmetatable',\
'_lua_settable',\
'_lua_settop',\
'_lua_toboolean',\
'_lua_tolstring',\
'_lua_tonumberx',\
'_lua_type'\
Expand Down
3 changes: 1 addition & 2 deletions src/jsvar_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,7 @@ int luajs_jsobject_toTable(lua_State *L) {

Module.__pushVar($0, idx);
Module.__pushVar($0, obj[idx]);
Module.__luaNative.lua_rawseti($0, -3);
Module.__luaNative.js_drop($0, 1);
Module.__luaNative.lua_rawset($0, -3);
}
},
L, data->ptr);
Expand Down
3 changes: 3 additions & 0 deletions src/lua_interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ declare var global: unknown;
switch (luaNative!.lua_type(state, pos)) {
case LuaTypes.nil:
return undefined;
case LuaTypes.boolean:
return luaNative!.lua_toboolean(state, pos) !== 0;
case LuaTypes.number:
return luaNative!.js_tonumber(state, pos);
case LuaTypes.string:
Expand Down Expand Up @@ -258,6 +260,7 @@ declare var global: unknown;
["lua_settable", "", ["number", "number"]],
["lua_settop", "", ["number", "number"]],
["lua_tolstring", "number", ["number", "number", "number"]],
["lua_toboolean", "number", ["number", "number"]],
["lua_tonumberx", "number", ["number", "number", "number"]],
["lua_type", "number", ["number", "number"]],
]);
Expand Down
101 changes: 51 additions & 50 deletions src/types/lua_native.d.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,51 @@
interface LuaNativeFromC {
jslua_alloc_int(): EmscriptenPointer;
jslua_alloc_size_t(): EmscriptenPointer;
jslua_call(state: EmscriptenPointer, length: number): number;
jslua_delete_state(state: EmscriptenPointer): void;
jslua_execute(state: EmscriptenPointer, codeC: number, codeLen: number, blockNameC: any): any;
jslua_get_state_global(state: EmscriptenPointer): number;
jslua_new_state(): EmscriptenPointer;
jslua_popvar(state: EmscriptenPointer, pos: number): number;
jslua_pushref(state: EmscriptenPointer, index: number): void;
jslua_pushvar(state: EmscriptenPointer, arg1: any, func: number): void;
jslua_read_int(ptr: EmscriptenPointer): number;
jslua_read_size_t(ptr: EmscriptenPointer): number;
jslua_toref(state: EmscriptenPointer, pos: number): number;
jslua_unref(state: EmscriptenPointer, index: any): void;
lua_createtable(state: EmscriptenPointer, arg1: number, arg2: number): void;
lua_getmetatable(state: EmscriptenPointer, arg1: number): number;
lua_gettable(state: EmscriptenPointer, arg1: number): void;
lua_gettop(state: EmscriptenPointer): number;
lua_next(state: EmscriptenPointer, arg1: number): number;
lua_pushboolean(state: EmscriptenPointer, arg1: number): void;
lua_pushlstring(state: EmscriptenPointer, argPtr: EmscriptenPointer, argLen: number): void;
lua_pushnil(state: EmscriptenPointer): void;
lua_pushnumber(state: EmscriptenPointer, arg: number): void;
lua_pushvalue(state: EmscriptenPointer, arg1: number): void;
lua_rawset(state: EmscriptenPointer, arg1: number): void;
lua_rawseti(state: EmscriptenPointer, arg1: number): void;
lua_setmetatable(state: EmscriptenPointer, arg1: number): number;
lua_settable(state: EmscriptenPointer, arg1: number): void;
lua_settop(state: EmscriptenPointer, arg1: number): void;
lua_tolstring(state: EmscriptenPointer, i: number, lenC: number): number;
lua_tonumberx(state: EmscriptenPointer, i: any, isNumberC: number): number;
lua_type(state: EmscriptenPointer, pos: number): number;
}

interface LuaNative extends LuaNativeFromC {
js_tonumber(state: EmscriptenPointer, pos: number): number;
js_tostring(state: EmscriptenPointer, pos: number): string;
js_drop(state: EmscriptenPointer, arg1: number): void;
js_pop_ref(state: EmscriptenPointer): number;
}

type EmscriptenLuaNative = {
[k in keyof LuaNativeFromC as `_${k}`]: LuaNativeFromC[k];
};

interface JSLuaConstructor {
new (...params: unknown): unknown;
}
type JSLuaFunction = Function & JSLuaConstructor;
interface LuaNativeFromC {
jslua_alloc_int(): EmscriptenPointer;
jslua_alloc_size_t(): EmscriptenPointer;
jslua_call(state: EmscriptenPointer, length: number): number;
jslua_delete_state(state: EmscriptenPointer): void;
jslua_execute(state: EmscriptenPointer, codeC: number, codeLen: number, blockNameC: any): any;
jslua_get_state_global(state: EmscriptenPointer): number;
jslua_new_state(): EmscriptenPointer;
jslua_popvar(state: EmscriptenPointer, pos: number): number;
jslua_pushref(state: EmscriptenPointer, index: number): void;
jslua_pushvar(state: EmscriptenPointer, arg1: any, func: number): void;
jslua_read_int(ptr: EmscriptenPointer): number;
jslua_read_size_t(ptr: EmscriptenPointer): number;
jslua_toref(state: EmscriptenPointer, pos: number): number;
jslua_unref(state: EmscriptenPointer, index: any): void;
lua_createtable(state: EmscriptenPointer, arg1: number, arg2: number): void;
lua_getmetatable(state: EmscriptenPointer, arg1: number): number;
lua_gettable(state: EmscriptenPointer, arg1: number): void;
lua_gettop(state: EmscriptenPointer): number;
lua_next(state: EmscriptenPointer, arg1: number): number;
lua_pushboolean(state: EmscriptenPointer, arg1: number): void;
lua_pushlstring(state: EmscriptenPointer, argPtr: EmscriptenPointer, argLen: number): void;
lua_pushnil(state: EmscriptenPointer): void;
lua_pushnumber(state: EmscriptenPointer, arg: number): void;
lua_pushvalue(state: EmscriptenPointer, arg1: number): void;
lua_rawset(state: EmscriptenPointer, arg1: number): void;
lua_rawseti(state: EmscriptenPointer, arg1: number): void;
lua_setmetatable(state: EmscriptenPointer, arg1: number): number;
lua_settable(state: EmscriptenPointer, arg1: number): void;
lua_settop(state: EmscriptenPointer, arg1: number): void;
lua_toboolean(state: EmscriptenPointer, arg1: number): number;
lua_tolstring(state: EmscriptenPointer, i: number, lenC: number): number;
lua_tonumberx(state: EmscriptenPointer, i: any, isNumberC: number): number;
lua_type(state: EmscriptenPointer, pos: number): number;
}

interface LuaNative extends LuaNativeFromC {
js_tonumber(state: EmscriptenPointer, pos: number): number;
js_tostring(state: EmscriptenPointer, pos: number): string;
js_drop(state: EmscriptenPointer, arg1: number): void;
js_pop_ref(state: EmscriptenPointer): number;
}

type EmscriptenLuaNative = {
[k in keyof LuaNativeFromC as `_${k}`]: LuaNativeFromC[k];
};

interface JSLuaConstructor {
new (...params: unknown): unknown;
}
type JSLuaFunction = Function & JSLuaConstructor;
7 changes: 3 additions & 4 deletions test/basics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import assert from 'node:assert';
import LuaJS from '../util/loader.ts';

function convertBack(ret) {
return [ret[0], ret[1].toObject()];
return [ret[0], ret[1].toObject(true)];
}

test('Can run basic Lua code', async () => {
Expand All @@ -25,7 +25,6 @@ test('Can pass JS types to Lua correctly', async () => {
assert.deepEqual(await func(13), ['number', 13]);
assert.deepEqual(await func([1,2,3]), ['userdata', [1,2,3]]);

assert.deepEqual(convertBack(await funcConvert([1,2,3])), ['table', { '1': 1, '2': 2, '3': 3 }]);
// TODO: Fix this!
// assert.deepEqual(convertBack(await funcConvert({'a': 1, 'b': '2', 'c': true})), ['table', {'a': 1, 'b': '2', 'c': true}]);
//assert.deepEqual(convertBack(await funcConvert([1,2,3])), ['table', { '1': 1, '2': 2, '3': 3 }]);
assert.deepEqual(convertBack(await funcConvert({'a': 1, 'b': '2', 'c': true})), ['table', {'a': 1, 'b': '2', 'c': true}]);
});

0 comments on commit 290a1b1

Please sign in to comment.