Skip to main content

luaur_repl_cli/functions/
setup_state.rs

1use core::ffi::c_void;
2
3use luaur_code_gen::functions::luau_codegen_create::luau_codegen_create;
4use luaur_require::functions::luaopen_require::luaopen_require;
5use luaur_vm::functions::lua_l_openlibs::lua_l_openlibs;
6use luaur_vm::functions::lua_l_register::lua_l_register;
7use luaur_vm::functions::lua_l_sandbox::lua_l_sandbox;
8use luaur_vm::functions::lua_pushvalue::lua_pushvalue;
9use luaur_vm::macros::lua_globalsindex::LUA_GLOBALSINDEX;
10use luaur_vm::macros::lua_pop::lua_pop;
11use luaur_vm::records::lua_l_reg::LuaLReg;
12use luaur_vm::type_aliases::lua_state::lua_State;
13
14use crate::functions::create_cli_require_context::create_cli_require_context;
15use crate::functions::lua_collectgarbage::lua_collectgarbage;
16use crate::functions::lua_loadstring::lua_loadstring;
17use crate::functions::repl_main::repl_codegen_enabled;
18use crate::functions::require_config_init::require_config_init;
19
20pub unsafe fn setup_state(l: *mut lua_State) {
21    if repl_codegen_enabled() {
22        luau_codegen_create(l);
23    }
24
25    lua_l_openlibs(l);
26
27    // Note: a CALLGRIND build also registers {"callgrind", lua_callgrind}; the
28    // upstream default (non-CALLGRIND) build registers only these two.
29    let funcs: [LuaLReg; 3] = [
30        LuaLReg {
31            name: c"loadstring".as_ptr(),
32            func: Some(lua_loadstring),
33        },
34        LuaLReg {
35            name: c"collectgarbage".as_ptr(),
36            func: Some(lua_collectgarbage),
37        },
38        LuaLReg {
39            name: core::ptr::null(),
40            func: None,
41        },
42    ];
43
44    lua_pushvalue(l, LUA_GLOBALSINDEX);
45    lua_l_register(l, core::ptr::null(), funcs.as_ptr());
46    lua_pop(l, 1);
47
48    let ctx = create_cli_require_context(l);
49    luaopen_require(l, Some(require_config_init), ctx as *mut c_void);
50
51    lua_l_sandbox(l);
52}