Skip to main content

luaur_vm/functions/
lua_f_close.rs

1use crate::functions::lua_f_closeupval::luaF_closeupval;
2use crate::macros::isblack::isblack;
3use crate::macros::isdead::isdead;
4use crate::macros::upisopen::upisopen;
5use crate::records::gc_object::GCObject;
6use crate::records::up_val::UpVal;
7use crate::type_aliases::lua_state::lua_State;
8use crate::type_aliases::stk_id::StkId;
9use luaur_common::macros::luau_assert::LUAU_ASSERT;
10
11#[allow(non_snake_case)]
12pub unsafe fn luaF_close(l: *mut lua_State, level: StkId) {
13    let g = (*l).global;
14
15    while !(*l).openupval.is_null() && (*(*l).openupval).v >= level {
16        let uv: *mut UpVal = (*l).openupval;
17        let o = uv as *mut GCObject;
18        LUAU_ASSERT!(!isblack!(o) && upisopen!(uv));
19        LUAU_ASSERT!(!isdead!(g, o));
20
21        (*l).openupval = (*uv).u.open.threadnext;
22        luaF_closeupval(l, uv, false);
23    }
24}
25
26#[allow(unused_imports)]
27pub use luaF_close as lua_f_close;
28
29#[export_name = "luaF_close"]
30pub unsafe extern "C" fn lua_f_close_export(l: *mut lua_State, level: StkId) {
31    luaF_close(l, level);
32}