Skip to main content

luaur_vm/functions/
validateobj.rs

1use crate::enums::lua_type::lua_Type;
2use crate::functions::validateclass::validateclass;
3use crate::functions::validateclosure::validateclosure;
4use crate::functions::validateobject::validateobject;
5use crate::functions::validateobjref::validateobjref;
6use crate::functions::validateproto::validateproto;
7use crate::functions::validateref::validateref;
8use crate::functions::validatestack::validatestack;
9use crate::functions::validatetable::validatetable;
10use crate::macros::gco_2_cl::gco2cl;
11use crate::macros::gco_2_class::gco2class;
12use crate::macros::gco_2_h::gco2h;
13use crate::macros::gco_2_object::gco2object;
14use crate::macros::gco_2_p::gco2p;
15use crate::macros::gco_2_th::gco2th;
16use crate::macros::gco_2_u::gco2u;
17use crate::macros::gco_2_uv::gco2uv;
18use crate::macros::isdead::isdead;
19use crate::macros::obj_2_gco::obj2gco;
20use crate::records::gc_object::GCObject;
21use crate::records::global_state::global_State;
22use luaur_common::macros::luau_assert::LUAU_ASSERT;
23
24#[allow(non_snake_case)]
25pub unsafe fn validateobj(g: *mut global_State, o: *mut GCObject) {
26    if isdead!(g, o) {
27        LUAU_ASSERT!((*g).gcstate == 4);
28        return;
29    }
30
31    match (*o).gch.tt as i32 {
32        t if t == lua_Type::LUA_TSTRING as i32 => {}
33        t if t == lua_Type::LUA_TTABLE as i32 => {
34            validatetable(g, gco2h!(o) as *mut _);
35        }
36        t if t == lua_Type::LUA_TFUNCTION as i32 => {
37            validateclosure(g, gco2cl!(o) as *mut _);
38        }
39        t if t == lua_Type::LUA_TUSERDATA as i32 => {
40            let u = gco2u!(o) as *const _ as *mut crate::records::udata::Udata;
41            if !(*u).metatable.is_null() {
42                validateobjref(g, o, obj2gco!((*u).metatable));
43            }
44        }
45        t if t == lua_Type::LUA_TTHREAD as i32 => {
46            validatestack(g, gco2th!(o) as *mut _);
47        }
48        t if t == lua_Type::LUA_TBUFFER as i32 => {}
49        t if t == lua_Type::LUA_TPROTO as i32 => {
50            validateproto(g, gco2p!(o) as *mut _);
51        }
52        t if t == lua_Type::LUA_TUPVAL as i32 => {
53            let uv = gco2uv!(o) as *const _ as *mut crate::records::up_val::UpVal;
54            validateref(g, o, (*uv).v);
55        }
56        t if t == lua_Type::LUA_TCLASS as i32 => {
57            validateclass(g, gco2class!(o) as *mut _);
58        }
59        t if t == lua_Type::LUA_TOBJECT as i32 => {
60            validateobject(g, gco2object!(o) as *mut _);
61        }
62        _ => {
63            LUAU_ASSERT!(false);
64        }
65    }
66}