Skip to main content

luaur_vm/functions/
lua_b_setmetatable.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lbaselib.cpp:75:luaB_setmetatable`
2//! Source: `VM/src/lbaselib.cpp:75-85` (hand-ported)
3
4use 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}