luaur_vm/functions/
tclone.rs1use crate::enums::lua_type::lua_Type;
2use crate::functions::lua_a_pushvalue::luaA_pushvalue;
3use crate::functions::lua_h_clone::lua_h_clone;
4use crate::functions::lua_l_checktype::lua_l_checktype;
5use crate::functions::lua_l_getmetafield::lua_l_getmetafield;
6use crate::macros::hvalue::hvalue;
7use crate::macros::lua_l_argcheck::luaL_argcheck;
8use crate::macros::sethvalue::sethvalue;
9use crate::type_aliases::lua_state::lua_State;
10use crate::type_aliases::t_value::TValue;
11use core::ffi::c_int;
12
13#[no_mangle]
14pub unsafe fn tclone(L: *mut lua_State) -> c_int {
15 lua_l_checktype(L, 1, lua_Type::LUA_TTABLE as c_int);
16
17 luaL_argcheck!(
18 L,
19 lua_l_getmetafield(L, 1, c"__metatable".as_ptr()) == 0,
20 1,
21 "table has a protected metatable"
22 );
23
24 let tt = lua_h_clone(L, hvalue!((*L).base));
25
26 let mut v: TValue = core::mem::zeroed();
27 sethvalue!(L, &mut v, tt);
28 luaA_pushvalue(L, &v);
29
30 1
31}