aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-06-26 11:01:01 +0200
committerBenoit Germain <benoit.germain@ubisoft.com>2024-06-26 11:01:01 +0200
commit57176e9b135b037fd33b8291d12416b9485b759b (patch)
treed716ce09d572f8ebf7272117928c7b6072dd7aff /src
parent2c6898964400e6fa77b0e368f477b739fc155f90 (diff)
downloadlanes-57176e9b135b037fd33b8291d12416b9485b759b.tar.gz
lanes-57176e9b135b037fd33b8291d12416b9485b759b.tar.bz2
lanes-57176e9b135b037fd33b8291d12416b9485b759b.zip
Make lanes.gen stricter on base libraries
Diffstat (limited to 'src')
-rw-r--r--src/lanes.cpp1
-rw-r--r--src/lanes.lua47
-rw-r--r--src/state.cpp36
-rw-r--r--src/state.h1
-rw-r--r--src/universe.cpp2
5 files changed, 60 insertions, 27 deletions
diff --git a/src/lanes.cpp b/src/lanes.cpp
index cab5944..39723ca 100644
--- a/src/lanes.cpp
+++ b/src/lanes.cpp
@@ -636,6 +636,7 @@ namespace {
636 { "set_thread_priority", LG_set_thread_priority }, 636 { "set_thread_priority", LG_set_thread_priority },
637 { "set_thread_affinity", LG_set_thread_affinity }, 637 { "set_thread_affinity", LG_set_thread_affinity },
638 { "sleep", LG_sleep }, 638 { "sleep", LG_sleep },
639 { "supported_libs", state::LG_supported_libs },
639 { "wakeup_conv", LG_wakeup_conv }, 640 { "wakeup_conv", LG_wakeup_conv },
640 { nullptr, nullptr } 641 { nullptr, nullptr }
641 }; 642 };
diff --git a/src/lanes.lua b/src/lanes.lua
index 90f9cd2..6a4f149 100644
--- a/src/lanes.lua
+++ b/src/lanes.lua
@@ -222,23 +222,25 @@ end
222 222
223local valid_libs = 223local valid_libs =
224{ 224{
225 ["package"] = true, 225 ["base"] = true,
226 ["table"] = true, 226 ["bit"] = true,
227 ["bit32"] = true,
228 ["coroutine"] = true,
229 ["debug"] = true,
230 ["ffi"] = true,
227 ["io"] = true, 231 ["io"] = true,
232 ["jit"] = true,
233 ["math"] = true,
228 ["os"] = true, 234 ["os"] = true,
235 ["package"] = true,
229 ["string"] = true, 236 ["string"] = true,
230 ["math"] = true, 237 ["table"] = true,
231 ["debug"] = true, 238 ["utf8"] = true,
232 ["bit32"] = true, -- Lua 5.2 only, ignored silently under 5.1
233 ["utf8"] = true, -- Lua 5.3 only, ignored silently under 5.1 and 5.2
234 ["bit"] = true, -- LuaJIT only, ignored silently under PUC-Lua
235 ["jit"] = true, -- LuaJIT only, ignored silently under PUC-Lua
236 ["ffi"] = true, -- LuaJIT only, ignored silently under PUC-Lua
237 -- 239 --
238 ["base"] = true,
239 ["coroutine"] = true, -- part of "base" in Lua 5.1
240 ["lanes.core"] = true 240 ["lanes.core"] = true
241} 241}
242-- same structure, but contains only the libraries that the current Lua flavor actually supports
243local supported_libs
242 244
243-- ################################################################################################# 245-- #################################################################################################
244 246
@@ -375,14 +377,17 @@ local gen = function(...)
375 error "Libs specification '*' must be used alone" 377 error "Libs specification '*' must be used alone"
376 end 378 end
377 local found = {} 379 local found = {}
378 for s in string_gmatch(libs, "[%a%d.]+") do 380 -- accept lib identifiers followed by an optional question mark
381 for s, question in string_gmatch(libs, "([%a%d.]+)(%??)") do
379 if not valid_libs[s] then 382 if not valid_libs[s] then
380 error("Bad library name: " .. s, 2) 383 error("Bad library name: " .. string_format("%q", tostring(s)), 2)
381 else 384 end
382 found[s] = (found[s] or 0) + 1 385 if question == '' and not supported_libs[s] then
383 if found[s] > 1 then 386 error("Unsupported library: " .. string_format("%q", tostring(s)), 2)
384 error("Libs specification contains '" .. s .. "' more than once", 2) 387 end
385 end 388 found[s] = (found[s] or 0) + 1
389 if found[s] > 1 then
390 error("Libs specification contains " .. string_format("%q", tostring(s)) .. " more than once", 2)
386 end 391 end
387 end 392 end
388 end 393 end
@@ -810,6 +815,11 @@ local configure = function(settings_)
810 lanes.configure = function() return lanes end -- no need to configure anything again 815 lanes.configure = function() return lanes end -- no need to configure anything again
811 816
812 -- now we can configure Lanes core 817 -- now we can configure Lanes core
818
819
820
821
822
813 local settings = core.configure and core.configure(params_checker(settings_)) or core.settings 823 local settings = core.configure and core.configure(params_checker(settings_)) or core.settings
814 824
815 -- 825 --
@@ -825,6 +835,7 @@ local configure = function(settings_)
825 -- avoid pulling the whole core module as upvalue when cancel_error is enough 835 -- avoid pulling the whole core module as upvalue when cancel_error is enough
826 -- these are locals declared above, that we need to set prior to calling configure_timers() 836 -- these are locals declared above, that we need to set prior to calling configure_timers()
827 cancel_error = assert(core.cancel_error) 837 cancel_error = assert(core.cancel_error)
838 supported_libs = assert(core.supported_libs())
828 timerLinda = assert(core.timerLinda) 839 timerLinda = assert(core.timerLinda)
829 840
830 if settings.with_timers then 841 if settings.with_timers then
diff --git a/src/state.cpp b/src/state.cpp
index 9cd7343..b50d135 100644
--- a/src/state.cpp
+++ b/src/state.cpp
@@ -57,32 +57,37 @@ namespace {
57 57
58 namespace local { 58 namespace local {
59 static luaL_Reg const sLibs[] = { 59 static luaL_Reg const sLibs[] = {
60 { "base", nullptr }, // ignore "base" (already acquired it) 60 { "base", nullptr }, // ignore "base" is always valid, but opened separately
61
62#if LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503
63 { LUA_BITLIBNAME, luaopen_bit32 }, // active in Lua 5.2, replaced with an error-throwing loader in Lua 5.3, gone after.
64#endif // LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503
65
61#if LUA_VERSION_NUM >= 502 66#if LUA_VERSION_NUM >= 502
62#ifdef luaopen_bit32
63 { LUA_BITLIBNAME, luaopen_bit32 },
64#endif
65 { LUA_COLIBNAME, luaopen_coroutine }, // Lua 5.2: coroutine is no longer a part of base! 67 { LUA_COLIBNAME, luaopen_coroutine }, // Lua 5.2: coroutine is no longer a part of base!
66#else // LUA_VERSION_NUM
67 { LUA_COLIBNAME, nullptr }, // Lua 5.1: part of base package
68#endif // LUA_VERSION_NUM 68#endif // LUA_VERSION_NUM
69
69 { LUA_DBLIBNAME, luaopen_debug }, 70 { LUA_DBLIBNAME, luaopen_debug },
71
70#ifndef PLATFORM_XBOX // no os/io libs on xbox 72#ifndef PLATFORM_XBOX // no os/io libs on xbox
71 { LUA_IOLIBNAME, luaopen_io }, 73 { LUA_IOLIBNAME, luaopen_io },
72 { LUA_OSLIBNAME, luaopen_os }, 74 { LUA_OSLIBNAME, luaopen_os },
73#endif // PLATFORM_XBOX 75#endif // PLATFORM_XBOX
76
74 { LUA_LOADLIBNAME, luaopen_package }, 77 { LUA_LOADLIBNAME, luaopen_package },
75 { LUA_MATHLIBNAME, luaopen_math }, 78 { LUA_MATHLIBNAME, luaopen_math },
76 { LUA_STRLIBNAME, luaopen_string }, 79 { LUA_STRLIBNAME, luaopen_string },
77 { LUA_TABLIBNAME, luaopen_table }, 80 { LUA_TABLIBNAME, luaopen_table },
81
78#if LUA_VERSION_NUM >= 503 82#if LUA_VERSION_NUM >= 503
79 { LUA_UTF8LIBNAME, luaopen_utf8 }, 83 { LUA_UTF8LIBNAME, luaopen_utf8 },
80#endif 84#endif // LUA_VERSION_NUM >= 503
85
81#if LUAJIT_FLAVOR() != 0 // building against LuaJIT headers, add some LuaJIT-specific libs 86#if LUAJIT_FLAVOR() != 0 // building against LuaJIT headers, add some LuaJIT-specific libs
82 { LUA_BITLIBNAME, luaopen_bit }, 87 { LUA_BITLIBNAME, luaopen_bit },
83 { LUA_FFILIBNAME, luaopen_ffi }, 88 { LUA_FFILIBNAME, luaopen_ffi },
84 { LUA_JITLIBNAME, luaopen_jit }, 89 { LUA_JITLIBNAME, luaopen_jit },
85#endif // LUAJIT_FLAVOR() 90#endif // LUAJIT_FLAVOR() != 0
86 91
87 { kLanesCoreLibName, require_lanes_core } // So that we can open it like any base library (possible since we have access to the init function) 92 { kLanesCoreLibName, require_lanes_core } // So that we can open it like any base library (possible since we have access to the init function)
88 }; 93 };
@@ -312,6 +317,21 @@ namespace state {
312 } 317 }
313 318
314 // ############################################################################################# 319 // #############################################################################################
320
321 // for internal use only: tell lanes.lua which base libraries are actually supported internally
322 LUAG_FUNC(supported_libs)
323 {
324 STACK_CHECK_START_REL(L_, 0);
325 lua_newtable(L_); // L_: out
326 for (luaL_Reg const& _entry : local::sLibs) {
327 lua_pushboolean(L_, 1); // L_: out true
328 luaG_setfield(L_, -2, std::string_view{ _entry.name }); // out[name] = true // L_: out
329 }
330 STACK_CHECK(L_, 1);
331 return 1;
332 }
333
334 // #############################################################################################
315 // ############################################################################################# 335 // #############################################################################################
316} // namespace state 336} // namespace state
317// ################################################################################################# 337// #################################################################################################
diff --git a/src/state.h b/src/state.h
index f809d50..a6bb43b 100644
--- a/src/state.h
+++ b/src/state.h
@@ -10,4 +10,5 @@ class Universe;
10namespace state { 10namespace state {
11 [[nodiscard]] lua_State* CreateState(Universe* U_, lua_State* from_, std::string_view const& hint_); 11 [[nodiscard]] lua_State* CreateState(Universe* U_, lua_State* from_, std::string_view const& hint_);
12 [[nodiscard]] lua_State* NewLaneState(Universe* U_, SourceState from_, std::optional<std::string_view> const& libs_); 12 [[nodiscard]] lua_State* NewLaneState(Universe* U_, SourceState from_, std::optional<std::string_view> const& libs_);
13 LUAG_FUNC(supported_libs);
13} // namespace state 14} // namespace state
diff --git a/src/universe.cpp b/src/universe.cpp
index 0dc5646..1cb4fd0 100644
--- a/src/universe.cpp
+++ b/src/universe.cpp
@@ -111,7 +111,7 @@ void Universe::callOnStateCreate(lua_State* const L_, lua_State* const from_, Lo
111 std::string_view const _stateType{ mode_ == LookupMode::LaneBody ? "lane" : "keeper" }; 111 std::string_view const _stateType{ mode_ == LookupMode::LaneBody ? "lane" : "keeper" };
112 luaG_pushstring(L_, _stateType); // L_: on_state_create() "<type>" 112 luaG_pushstring(L_, _stateType); // L_: on_state_create() "<type>"
113 if (lua_pcall(L_, 1, 0, 0) != LUA_OK) { 113 if (lua_pcall(L_, 1, 0, 0) != LUA_OK) {
114 raise_luaL_error(from_, "%s failed: \"%s\"", kOnStateCreate.data(), lua_isstring(L_, -1) ? luaG_tostring(L_, -1).data() : luaG_typename(L_, -1).data()); 114 raise_luaL_error(from_, "%s failed in %s: \"%s\"", kOnStateCreate.data(), _stateType.data(), lua_isstring(L_, -1) ? luaG_tostring(L_, -1).data() : luaG_typename(L_, -1).data());
115 } 115 }
116 STACK_CHECK(L_, 0); 116 STACK_CHECK(L_, 0);
117} 117}