Skip to main content

luaur_vm/functions/
lua_setfenv.rs

1use core::ffi::c_int;
2
3use crate::enums::lua_type::lua_Type;
4use crate::functions::index_2_addr::index_2_addr;
5use crate::macros::api_check::api_check;
6use crate::macros::api_checknelems::api_checknelems;
7use crate::macros::gcvalue::gcvalue;
8use crate::macros::hvalue::hvalue;
9use crate::macros::lua_c_objbarrier::luaC_objbarrier;
10use crate::macros::lua_o_nilobject::luaO_nilobject;
11use crate::macros::ttistable::ttistable;
12use crate::macros::ttype::ttype;
13use crate::records::closure::Closure;
14use crate::records::lua_state::lua_State;
15use crate::records::lua_table::LuaTable;
16use crate::type_aliases::stk_id::StkId;
17
18#[allow(non_snake_case)]
19pub unsafe fn lua_setfenv(L: *mut lua_State, idx: c_int) -> c_int {
20    let mut res: c_int = 1;
21    api_checknelems!(L, 1);
22    let o: StkId = index_2_addr(L, idx);
23    api_check!(L, o != luaO_nilobject as StkId);
24    api_check!(L, ttistable!((*L).top.sub(1)));
25    match ttype!(o) {
26        x if x == lua_Type::LUA_TFUNCTION as c_int => {
27            let cl = core::ptr::addr_of_mut!((*(*o).value.gc).cl) as *mut Closure;
28            (*cl).env = hvalue!((*L).top.sub(1));
29        }
30        x if x == lua_Type::LUA_TTHREAD as c_int => {
31            let th = core::ptr::addr_of_mut!((*(*o).value.gc).th) as *mut lua_State;
32            (*th).gt = hvalue!((*L).top.sub(1));
33        }
34        _ => {
35            res = 0;
36        }
37    }
38    if res != 0 {
39        luaC_objbarrier!(L, gcvalue!(o), hvalue!((*L).top.sub(1)) as *mut LuaTable);
40    }
41    (*L).top = (*L).top.sub(1);
42    res
43}