luaur_vm/functions/
lua_b_setfenv.rs1use crate::enums::lua_type::lua_Type;
2use crate::functions::getfunc::getfunc;
3use crate::functions::lua_insert::lua_insert;
4use crate::functions::lua_iscfunction::lua_iscfunction;
5use crate::functions::lua_isnumber::lua_isnumber;
6use crate::functions::lua_l_checktype::lua_l_checktype;
7use crate::functions::lua_l_error_l::lua_l_error_l;
8use crate::functions::lua_pushthread::lua_pushthread;
9use crate::functions::lua_pushvalue::lua_pushvalue;
10use crate::functions::lua_setfenv::lua_setfenv;
11use crate::functions::lua_setsafeenv::lua_setsafeenv;
12use crate::macros::lua_tonumber::lua_tonumber;
13use crate::type_aliases::lua_state::lua_State;
14
15pub unsafe fn lua_b_setfenv(L: *mut lua_State) -> i32 {
16 lua_l_checktype(L, 2, lua_Type::LUA_TTABLE as i32);
17 getfunc(L, 0);
18 lua_pushvalue(L, 2);
19 lua_setsafeenv(L, -1, 0);
20 if lua_isnumber(L, 1) != 0 && lua_tonumber!(L, 1) == 0.0 {
21 lua_pushthread(L);
22 lua_insert(L, -2);
23 lua_setfenv(L, -2);
24 return 0;
25 } else if lua_iscfunction(L, -2) != 0 || lua_setfenv(L, -2) == 0 {
26 lua_l_error_l(
27 L,
28 c"'setfenv' cannot change environment of given object".as_ptr(),
29 format_args!("'setfenv' cannot change environment of given object"),
30 );
31 }
32 1
33}