luaur_vm/functions/
lua_b_setmetatable.rs1use crate::enums::lua_type::lua_Type;
5use crate::functions::lua_l_checktype::lua_l_checktype;
6use crate::functions::lua_l_error_l::lua_l_error_l;
7use crate::functions::lua_l_getmetafield::lua_l_getmetafield;
8use crate::functions::lua_setmetatable::lua_setmetatable;
9use crate::functions::lua_settop::lua_settop;
10use crate::functions::lua_type::lua_type;
11use crate::macros::lua_l_argexpected::luaL_argexpected;
12use crate::type_aliases::lua_state::lua_State;
13
14#[allow(non_snake_case)]
15pub unsafe fn lua_b_setmetatable(L: *mut lua_State) -> i32 {
16 let t = lua_type(L, 2);
17 lua_l_checktype(L, 1, lua_Type::LUA_TTABLE as i32);
18 luaL_argexpected!(
19 L,
20 t == lua_Type::LUA_TNIL as i32 || t == lua_Type::LUA_TTABLE as i32,
21 2,
22 "nil or table"
23 );
24 if lua_l_getmetafield(L, 1, c"__metatable".as_ptr()) != 0 {
25 lua_l_error_l(
26 L,
27 c"cannot change a protected metatable".as_ptr(),
28 format_args!("cannot change a protected metatable"),
29 );
30 }
31 lua_settop(L, 2);
32 lua_setmetatable(L, 1);
33 1
34}