luaur_require/functions/
lua_requirecont.rs1use 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}