luaur_vm/functions/
reallymarkobject.rs1use 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); 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 gray2black!(o); }
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); }
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}