Skip to main content

luaur_vm/functions/
markroot.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lgc.cpp:805:markroot`
2//! Source: `VM/src/lgc.cpp` (lgc.cpp:805-837, hand-ported)
3
4use 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// mark root set
13#[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    // make global table be traversed before main stack
21    markobject!(g, (*(*g).mainthread).gt);
22    // registry(L) — &L->global->registry
23    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}