Skip to main content

luaur_vm/functions/
lua_l_register.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/laux.cpp:304:luaL_register`
2//! Source: `VM/src/laux.cpp:304-327` (hand-ported)
3
4use core::ffi::c_char;
5
6use crate::functions::libsize::libsize;
7use crate::functions::lua_getfield::lua_getfield;
8use crate::functions::lua_l_error_l::lua_l_error_l;
9use crate::functions::lua_l_findtable::luaL_findtable;
10use crate::functions::lua_pushvalue::lua_pushvalue;
11use crate::functions::lua_remove::lua_remove;
12use crate::functions::lua_setfield::lua_setfield;
13use crate::functions::lua_type::lua_type;
14use crate::macros::lua_globalsindex::LUA_GLOBALSINDEX;
15use crate::macros::lua_pop::lua_pop;
16use crate::macros::lua_pushcfunction::LUA_PUSHCFUNCTION;
17use crate::macros::lua_registryindex::LUA_REGISTRYINDEX;
18use crate::records::lua_l_reg::LuaLReg;
19use crate::type_aliases::lua_state::lua_State;
20
21#[allow(non_snake_case)]
22pub unsafe fn lua_l_register(L: *mut lua_State, libname: *const c_char, mut l: *const LuaLReg) {
23    if !libname.is_null() {
24        let size = libsize(l);
25        luaL_findtable(L, LUA_REGISTRYINDEX, c"_LOADED".as_ptr(), 1);
26        lua_getfield(L, -1, libname);
27        if lua_type(L, -1) != crate::enums::lua_type::lua_Type::LUA_TTABLE as i32 {
28            lua_pop(L, 1);
29            if !luaL_findtable(L, LUA_GLOBALSINDEX, libname, size).is_null() {
30                let name = core::ffi::CStr::from_ptr(libname).to_string_lossy();
31                lua_l_error_l(
32                    L,
33                    c"name conflict for module '%s'".as_ptr(),
34                    format_args!("name conflict for module '{}'", name),
35                );
36            }
37            lua_pushvalue(L, -1);
38            lua_setfield(L, -3, libname);
39        }
40        lua_remove(L, -2);
41    }
42
43    while !(*l).name.is_null() {
44        LUA_PUSHCFUNCTION(L, (*l).func, (*l).name);
45        lua_setfield(L, -2, (*l).name);
46        l = l.add(1);
47    }
48}