Skip to main content

luaur_vm/functions/
validateobjref.rs

1use 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        // basic incremental invariant: black can't point to white
13        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}