Skip to main content

luaur_require/functions/
lua_requirecont.rs

1use core::ffi::c_char;
2use luaur_vm::functions::lua_getfield::lua_getfield;
3use luaur_vm::functions::lua_gettop::lua_gettop;
4use luaur_vm::functions::lua_pushvalue::lua_pushvalue;
5use luaur_vm::functions::lua_setfield::lua_setfield;
6use luaur_vm::macros::lua_l_checkstring::luaL_checkstring;
7use luaur_vm::macros::lua_l_error::luaL_error;
8use luaur_vm::macros::lua_pop::lua_pop;
9use luaur_vm::macros::lua_registryindex::LUA_REGISTRYINDEX;
10use luaur_vm::records::lua_state::lua_State;
11
12const REQUIRED_CACHE_TABLE_KEY: *const c_char = c"_MODULES".as_ptr();
13pub const K_REQUIRE_STACK_VALUES: i32 = 4;
14
15pub fn lua_requirecont(l: *mut lua_State, _status: i32) -> i32 {
16    unsafe {
17        luaur_common::LUAU_ASSERT!(lua_gettop(l) >= K_REQUIRE_STACK_VALUES);
18        let num_results = lua_gettop(l) - K_REQUIRE_STACK_VALUES;
19        let cache_key = luaL_checkstring!(l, 2);
20
21        if num_results > 1 {
22            luaL_error!(l, "module must return a single value");
23            return 0;
24        }
25
26        if num_results == 1 {
27            lua_getfield(l, LUA_REGISTRYINDEX, REQUIRED_CACHE_TABLE_KEY);
28            lua_pushvalue(l, -2);
29            lua_setfield(l, -2, cache_key);
30            lua_pop(l, 1);
31        }
32
33        num_results
34    }
35}