luaur_vm/functions/
lua_registeruserdatadirectfieldget.rs1use 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}