Skip to main content

luaur_vm/functions/
validateclosure.rs

1use crate::functions::validateobjref::validateobjref;
2use crate::functions::validateref::validateref;
3use crate::macros::obj_2_gco::obj2gco;
4use crate::records::closure::{CClosure, Closure, LClosure};
5use crate::records::global_state::global_State;
6use luaur_common::macros::luau_assert::LUAU_ASSERT;
7
8#[allow(non_snake_case)]
9pub(crate) unsafe fn validateclosure(g: *mut global_State, cl: *mut Closure) {
10    validateobjref(g, obj2gco!(cl as *mut Closure), obj2gco!((*cl).env));
11
12    if (*cl).isC != 0 {
13        let c = core::ptr::addr_of_mut!((*cl).inner.c) as *mut CClosure;
14        for i in 0..(*cl).nupvalues as usize {
15            validateref(
16                g,
17                obj2gco!(cl as *mut Closure),
18                (*c).upvals.as_mut_ptr().add(i),
19            );
20        }
21    } else {
22        let l = core::ptr::addr_of_mut!((*cl).inner.l) as *mut LClosure;
23        LUAU_ASSERT!((*cl).nupvalues as i32 == (*(*l).p).nups as i32);
24
25        validateobjref(g, obj2gco!(cl as *mut Closure), obj2gco!((*l).p));
26
27        let uprefs =
28            core::ptr::addr_of_mut!((*l).uprefs) as *mut crate::type_aliases::t_value::TValue;
29        for i in 0..(*cl).nupvalues as usize {
30            validateref(g, obj2gco!(cl as *mut Closure), uprefs.add(i));
31        }
32    }
33}