Skip to main content

luaur_vm/functions/
lua_c_upvalclosed.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lgc.cpp:1327:lua_c_upvalclosed`
2//! Source: `VM/src/lgc.cpp` (lgc.cpp:1327-1347, hand-ported)
3
4use crate::macros::gc_spause::GCSpause;
5use crate::macros::gray_2_black::gray2black;
6use crate::macros::isgray::isgray;
7use crate::macros::keepinvariant::keepinvariant;
8use crate::macros::lua_c_barrier::luaC_barrier;
9use crate::macros::makewhite::makewhite;
10use crate::macros::upisopen::upisopen;
11use crate::records::gc_object::GCObject;
12use crate::records::up_val::UpVal;
13use crate::type_aliases::lua_state::lua_State;
14use luaur_common::macros::luau_assert::LUAU_ASSERT;
15
16#[allow(non_snake_case)]
17pub unsafe fn luaC_upvalclosed(l: *mut lua_State, uv: *mut UpVal) {
18    let g = (*l).global;
19    let o = uv as *mut GCObject;
20
21    LUAU_ASSERT!(!upisopen!(uv)); // upvalue was closed but needs GC state fixup
22
23    if isgray!(o) {
24        if keepinvariant(g) {
25            gray2black!(o); // closed upvalues need barrier
26            luaC_barrier!(l, uv, (*uv).v);
27        } else {
28            // sweep phase: sweep it (turning it into white)
29            makewhite!(g, o);
30            LUAU_ASSERT!((*g).gcstate as i32 != GCSpause);
31        }
32    }
33}
34
35#[allow(unused_imports)]
36pub use luaC_upvalclosed as lua_c_upvalclosed;