Skip to main content

luaur_vm/functions/
lua_registeruserdatadirectfieldget.rs

1use core::ffi::{c_char, c_int, c_void};
2
3use crate::functions::lua_h_new::lua_h_new;
4use crate::functions::lua_h_setstr::lua_h_setstr;
5use crate::macros::api_check::api_check;
6use crate::macros::fixedbit::FIXEDBIT;
7use crate::macros::l_setbit::l_setbit;
8use crate::macros::lua_s_new::luaS_new;
9use crate::macros::lua_utag_limit::LUA_UTAG_LIMIT;
10use crate::macros::setpvalue::setpvalue;
11use crate::records::global_state::global_State;
12use crate::records::lua_state::lua_State;
13use crate::records::t_string::TString;
14use crate::type_aliases::lua_userdata_direct_field_get::lua_UserdataDirectFieldGet;
15use crate::type_aliases::t_value::TValue;
16
17#[allow(non_snake_case)]
18pub unsafe fn lua_registeruserdatadirectfieldget(
19    L: *mut lua_State,
20    tag: c_int,
21    field: *const c_char,
22    fn_: lua_UserdataDirectFieldGet,
23) {
24    if !luaur_common::FFlag::LuauDirectFieldGet.get() {
25        return;
26    }
27
28    api_check!(L, (tag as u32) < LUA_UTAG_LIMIT as u32);
29    api_check!(L, !field.is_null());
30    api_check!(L, fn_.is_some());
31
32    let g: *mut global_State = (*L).global;
33
34    if (*g).udatadirectfields[tag as usize].is_null() {
35        (*g).udatadirectfields[tag as usize] = lua_h_new(L, 0, 1);
36    }
37
38    let ts: *mut TString = luaS_new(L, field);
39    l_setbit!((*ts).hdr.marked, FIXEDBIT);
40
41    let slot: *mut TValue = lua_h_setstr(L, (*g).udatadirectfields[tag as usize], ts);
42    setpvalue!(slot, fn_.unwrap() as *mut c_void, 0);
43}