From c722b56b7e96b08b90a2d707ece6830ea98afc2d Mon Sep 17 00:00:00 2001 From: Francesco Abbate Date: Sun, 29 Nov 2020 11:45:32 +0100 Subject: [PATCH] Initial draft of transition to use LuaJIT2 instead of Lua 5.2 There is problem with utf8 expression matching on common.utf8_chars --- data/core/compat.lua | 2 ++ data/core/init.lua | 1 + meson.build | 8 +----- src/api/api.h | 2 ++ src/api/compat.c | 64 +++++++++++++++++++++++++++++++++++++++++ src/api/compat.h | 17 +++++++++++ src/meson.build | 1 + subprojects/lua.wrap | 4 --- subprojects/luajit.wrap | 5 ++++ 9 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 data/core/compat.lua create mode 100644 src/api/compat.c create mode 100644 src/api/compat.h delete mode 100644 subprojects/lua.wrap create mode 100644 subprojects/luajit.wrap diff --git a/data/core/compat.lua b/data/core/compat.lua new file mode 100644 index 00000000..d66af313 --- /dev/null +++ b/data/core/compat.lua @@ -0,0 +1,2 @@ +table.unpack = unpack + diff --git a/data/core/init.lua b/data/core/init.lua index 60d01f57..6e89b791 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -1,4 +1,5 @@ require "core.strict" +require "core.compat" local common = require "core.common" local config = require "core.config" local style = require "core.style" diff --git a/meson.build b/meson.build index d87e7154..30633a68 100644 --- a/meson.build +++ b/meson.build @@ -5,13 +5,7 @@ libm = cc.find_library('m', required : false) libdl = cc.find_library('dl', required : false) lua_dep = dependency('lua5.2', required : false) -if not lua_dep.found() - lua_subproject = subproject('lua', default_options: [ - 'default_library=static', 'use_readline=false' - ]) - lua_dep = lua_subproject.get_variable('lua_dep') -endif - +lua_dep = dependency('luajit') sdl_dep = dependency('sdl2', method: 'config-tool') lite_include = include_directories('src') diff --git a/src/api/api.h b/src/api/api.h index 3a93ad92..83a9353a 100644 --- a/src/api/api.h +++ b/src/api/api.h @@ -5,6 +5,8 @@ #include "lauxlib.h" #include "lualib.h" +#include "compat.h" + #define API_TYPE_FONT "Font" void api_load_libs(lua_State *L); diff --git a/src/api/compat.c b/src/api/compat.c new file mode 100644 index 00000000..e08b5a26 --- /dev/null +++ b/src/api/compat.c @@ -0,0 +1,64 @@ +#include + +#include "compat.h" + +static int lua_absindex (lua_State *L, int i) { + if (i < 0 && i > LUA_REGISTRYINDEX) + i += lua_gettop(L) + 1; + return i; +} + +int luaL_getsubtable (lua_State *L, int i, const char *name) { + int abs_i = lua_absindex(L, i); + luaL_checkstack(L, 3, "not enough stack slots"); + lua_pushstring(L, name); + lua_gettable(L, abs_i); + if (lua_istable(L, -1)) + return 1; + lua_pop(L, 1); + lua_newtable(L); + lua_pushstring(L, name); + lua_pushvalue(L, -2); + lua_settable(L, abs_i); + return 0; +} + +void luaL_requiref (lua_State *L, const char *modname, lua_CFunction openf, int glb) { + luaL_checkstack(L, 3, "not enough stack slots available"); + luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_getfield(L, -1, modname); + if (lua_isnil(L, -1)) { + lua_pop(L, 1); + lua_pushcfunction(L, openf); + lua_pushstring(L, modname); + lua_call(L, 1, 1); + lua_pushvalue(L, -1); + lua_setfield(L, -3, modname); + } + if (glb) { + lua_pushvalue(L, -1); + lua_setglobal(L, modname); + } + lua_replace(L, -2); +} + +void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { + luaL_checkstack(L, nup+1, "too many upvalues"); + for (; l->name != NULL; l++) { /* fill the table with given functions */ + int i; + lua_pushstring(L, l->name); + for (i = 0; i < nup; i++) /* copy upvalues to the top */ + lua_pushvalue(L, -(nup + 1)); + lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ + lua_settable(L, -(nup + 3)); /* table must be below the upvalues, the name and the closure */ + } + lua_pop(L, nup); /* remove upvalues */ +} + + +void luaL_setmetatable (lua_State *L, const char *tname) { + luaL_checkstack(L, 1, "not enough stack slots"); + luaL_getmetatable(L, tname); + lua_setmetatable(L, -2); +} + diff --git a/src/api/compat.h b/src/api/compat.h new file mode 100644 index 00000000..93220cd5 --- /dev/null +++ b/src/api/compat.h @@ -0,0 +1,17 @@ +#ifndef COMPAT_H +#define COMPAT_H + +#include +#include + +#define luaL_newlibtable(L, l) \ + (lua_createtable(L, 0, sizeof(l)/sizeof(*(l))-1)) +#define luaL_newlib(L, l) \ + (luaL_newlibtable(L, l), luaL_register(L, NULL, l)) + +extern void luaL_requiref (lua_State *L, const char *modname, lua_CFunction openf, int glb); +extern void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup); +extern void luaL_setmetatable (lua_State *L, const char *tname); +extern int luaL_getsubtable (lua_State *L, int i, const char *name); + +#endif diff --git a/src/meson.build b/src/meson.build index d224b251..dac8409f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,4 +1,5 @@ lite_sources = [ + 'api/compat.c', 'api/api.c', 'api/renderer.c', 'api/renderer_font.c', diff --git a/subprojects/lua.wrap b/subprojects/lua.wrap deleted file mode 100644 index c1032f2f..00000000 --- a/subprojects/lua.wrap +++ /dev/null @@ -1,4 +0,0 @@ -[wrap-git] -directory = lua -url = https://github.com/franko/lua -revision = v5.2.4-5 diff --git a/subprojects/luajit.wrap b/subprojects/luajit.wrap new file mode 100644 index 00000000..aca831ca --- /dev/null +++ b/subprojects/luajit.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory = luajit +url = https://github.com/franko/luajit +revision = v2.0.5-lhelper2 +