luaur_vm/functions/
lua_setfenv.rs1use 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}