Skip to main content

luaur_vm/functions/
lua_b_setfenv.rs

1use 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}