luaur_vm/functions/
validateobjref.rs1use crate::macros::isdead::isdead;
2use crate::macros::keepinvariant::keepinvariant;
3use crate::records::gc_object::GCObject;
4use crate::records::global_state::global_State;
5use luaur_common::macros::luau_assert::LUAU_ASSERT;
6
7#[allow(non_snake_case)]
8pub(crate) unsafe fn validateobjref(g: *mut global_State, f: *mut GCObject, t: *mut GCObject) {
9 LUAU_ASSERT!(!isdead!(g, t));
10
11 if keepinvariant(g) {
12 const WHITE0BIT: u8 = 0;
14 const WHITE1BIT: u8 = 1;
15 const BLACKBIT: u8 = 2;
16
17 const WHITEBITS: u8 = (1 << WHITE0BIT) | (1 << WHITE1BIT);
18 const BLACKBIT_MASK: u8 = 1 << BLACKBIT;
19
20 let is_black_f = ((*f).gch.marked & BLACKBIT_MASK) != 0;
21 let is_white_t = ((*t).gch.marked & WHITEBITS) != 0;
22
23 LUAU_ASSERT!(!(is_black_f && is_white_t));
24 }
25}