luaur_vm/functions/
markroot.rs1use crate::functions::markmt::markmt;
5use crate::macros::gc_spropagate::GCSpropagate;
6use crate::macros::markobject::markobject;
7use crate::macros::markvalue::markvalue;
8use crate::macros::utag_internal_limit::UTAG_INTERNAL_LIMIT;
9use crate::type_aliases::lua_state::lua_State;
10use crate::type_aliases::t_value::TValue;
11
12#[allow(non_snake_case)]
14pub(crate) unsafe fn markroot(l: *mut lua_State) {
15 let g = (*l).global;
16 (*g).gray = core::ptr::null_mut();
17 (*g).grayagain = core::ptr::null_mut();
18 (*g).weak = core::ptr::null_mut();
19 markobject!(g, (*g).mainthread);
20 markobject!(g, (*(*g).mainthread).gt);
22 markvalue!(g, core::ptr::addr_of_mut!((*g).registry));
24
25 if luaur_common::FFlag::LuauUdataDirectAccess6.get() {
26 for i in 0..UTAG_INTERNAL_LIMIT as usize {
27 let udatadirect = core::ptr::addr_of_mut!((*(*l).global).udatadirect[i]);
28
29 markvalue!(
30 g,
31 core::ptr::addr_of_mut!((*udatadirect).indextm) as *mut TValue
32 );
33 markvalue!(
34 g,
35 core::ptr::addr_of_mut!((*udatadirect).newindextm) as *mut TValue
36 );
37 markvalue!(
38 g,
39 core::ptr::addr_of_mut!((*udatadirect).namecalltm) as *mut TValue
40 );
41 }
42 }
43
44 if luaur_common::FFlag::LuauDirectFieldGet.get() {
45 for i in 0..UTAG_INTERNAL_LIMIT as usize {
46 if !(*g).udatadirectfields[i].is_null() {
47 markobject!(g, (*g).udatadirectfields[i]);
48 }
49 }
50 }
51
52 markmt(g);
53 (*g).gcstate = GCSpropagate as u8;
54}