Skip to main content

luaur_vm/functions/
lua_f_closeupval.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lfunc.cpp:156:lua_f_closeupval`
2//! Source: `VM/src/lfunc.cpp` (lfunc.cpp:156-169, hand-ported)
3
4use crate::functions::lua_c_upvalclosed::luaC_upvalclosed;
5use crate::macros::setobj::setobj;
6use crate::records::up_val::UpVal;
7use crate::type_aliases::lua_state::lua_State;
8use crate::type_aliases::t_value::TValue;
9use luaur_common::macros::luau_assert::LUAU_ASSERT;
10
11#[allow(non_snake_case)]
12pub unsafe fn luaF_closeupval(l: *mut lua_State, uv: *mut UpVal, dead: bool) {
13    // unlink value from all lists *before* closing it since value storage overlaps
14    LUAU_ASSERT!((*(*uv).u.open.next).u.open.prev == uv && (*(*uv).u.open.prev).u.open.next == uv);
15    (*(*uv).u.open.next).u.open.prev = (*uv).u.open.prev;
16    (*(*uv).u.open.prev).u.open.next = (*uv).u.open.next;
17
18    if dead {
19        return;
20    }
21
22    let value = core::ptr::addr_of_mut!((*uv).u.value) as *mut TValue;
23    setobj!(l, value, (*uv).v);
24    (*uv).v = value;
25    luaC_upvalclosed(l, uv);
26}
27
28#[allow(unused_imports)]
29pub use luaF_closeupval as lua_f_closeupval;