Skip to main content

luaur_vm/functions/
reallymarkobject.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lgc.cpp:239:reallymarkobject`
2//! Source: `VM/src/lgc.cpp` (lgc.cpp:239-309, hand-ported)
3
4use crate::enums::lua_type::lua_Type;
5use crate::macros::gco_2_cl::gco2cl;
6use crate::macros::gco_2_class::gco2class;
7use crate::macros::gco_2_h::gco2h;
8use crate::macros::gco_2_object::gco2object;
9use crate::macros::gco_2_p::gco2p;
10use crate::macros::gco_2_th::gco2th;
11use crate::macros::gco_2_u::gco2u;
12use crate::macros::gco_2_uv::gco2uv;
13use crate::macros::gray_2_black::gray2black;
14use crate::macros::isdead::isdead;
15use crate::macros::iswhite::iswhite;
16use crate::macros::markobject::markobject;
17use crate::macros::markvalue::markvalue;
18use crate::macros::upisopen::upisopen;
19use crate::macros::white_2_gray::white2gray;
20use crate::records::closure::Closure;
21use crate::records::gc_object::GCObject;
22use crate::records::global_state::global_State;
23use crate::records::lua_table::LuaTable;
24use crate::records::luau_class::LuauClass;
25use crate::records::luau_object::LuauObject;
26use crate::records::proto::Proto;
27use crate::records::up_val::UpVal;
28use crate::type_aliases::lua_state::lua_State;
29use luaur_common::macros::luau_assert::LUAU_ASSERT;
30
31#[allow(non_snake_case)]
32pub unsafe fn reallymarkobject(g: *mut global_State, o: *mut GCObject) {
33    LUAU_ASSERT!(iswhite!(o) && !isdead!(g, o));
34    white2gray!(o);
35    match (*o).gch.tt as i32 {
36        t if t == lua_Type::LUA_TSTRING as i32 => {}
37        t if t == lua_Type::LUA_TUSERDATA as i32 => {
38            let mt: *mut LuaTable = (*gco2u!(o)).metatable;
39            gray2black!(o); // udata are never gray
40            if !mt.is_null() {
41                markobject!(g, mt);
42            }
43        }
44        t if t == lua_Type::LUA_TUPVAL as i32 => {
45            let uv = gco2uv!(o) as *const _ as *mut UpVal;
46            markvalue!(g, (*uv).v);
47            if !upisopen!(uv) {
48                // closed?
49                gray2black!(o); // open upvalues are never black
50            }
51        }
52        t if t == lua_Type::LUA_TFUNCTION as i32 => {
53            (*(gco2cl!(o) as *const _ as *mut Closure)).gclist = (*g).gray;
54            (*g).gray = o;
55        }
56        t if t == lua_Type::LUA_TTABLE as i32 => {
57            (*(gco2h!(o) as *const _ as *mut LuaTable)).gclist = (*g).gray;
58            (*g).gray = o;
59        }
60        t if t == lua_Type::LUA_TTHREAD as i32 => {
61            (*(gco2th!(o) as *const _ as *mut lua_State)).gclist = (*g).gray;
62            (*g).gray = o;
63        }
64        t if t == lua_Type::LUA_TBUFFER as i32 => {
65            gray2black!(o); // buffers are never gray
66        }
67        t if t == lua_Type::LUA_TPROTO as i32 => {
68            (*(gco2p!(o) as *const _ as *mut Proto)).gclist = (*g).gray;
69            (*g).gray = o;
70        }
71        t if t == lua_Type::LUA_TCLASS as i32 => {
72            (*(gco2class!(o) as *const _ as *mut LuauClass)).gclist = (*g).gray;
73            (*g).gray = o;
74        }
75        t if t == lua_Type::LUA_TOBJECT as i32 => {
76            (*(gco2object!(o) as *const _ as *mut LuauObject)).gclist = (*g).gray;
77            (*g).gray = o;
78        }
79        _ => {
80            LUAU_ASSERT!(false);
81        }
82    }
83}