Skip to main content

luaur_vm/functions/
lua_registeruserdatadirectaccess.rs

1use core::ffi::c_int;
2
3use crate::functions::lua_concat::lua_c_threadbarrier_lapi;
4use crate::macros::api_check::api_check;
5use crate::macros::fasttm::fasttm;
6use crate::macros::lua_utag_limit::LUA_UTAG_LIMIT;
7use crate::records::lua_state::lua_State;
8use crate::type_aliases::lua_userdata_direct_access::lua_UserdataDirectAccess;
9use crate::type_aliases::lua_userdata_direct_namecall::lua_UserdataDirectNamecall;
10use crate::type_aliases::tms::TMS;
11
12#[allow(non_snake_case)]
13pub unsafe fn lua_registeruserdatadirectaccess(
14    L: *mut lua_State,
15    tag: c_int,
16    get: lua_UserdataDirectAccess,
17    set: lua_UserdataDirectAccess,
18    namecall: lua_UserdataDirectNamecall,
19) -> c_int {
20    api_check!(L, (tag as u32) < LUA_UTAG_LIMIT as u32);
21    lua_c_threadbarrier_lapi(L);
22
23    let h = (*(*L).global).udatamt[tag as usize];
24    if !h.is_null() {
25        let udatadirect = &mut (*(*L).global).udatadirect[tag as usize];
26
27        let indextm = fasttm(L, h, TMS::TM_INDEX as c_int);
28        if !indextm.is_null() {
29            udatadirect.indextm = *indextm;
30            udatadirect.index = get;
31        }
32
33        let newindextm = fasttm(L, h, TMS::TM_NEWINDEX as c_int);
34        if !newindextm.is_null() {
35            udatadirect.newindextm = *newindextm;
36            udatadirect.newindex = set;
37        }
38
39        let namecalltm = fasttm(L, h, TMS::TM_NAMECALL as c_int);
40        if !namecalltm.is_null() {
41            udatadirect.namecalltm = *namecalltm;
42            udatadirect.namecall = namecall;
43        }
44
45        return 1;
46    }
47
48    0
49}