luaur_vm/functions/
lua_h_clone.rs1use crate::enums::lua_type::lua_Type;
2use crate::macros::dummynode::dummynode;
3use crate::macros::getaboundary::getaboundary;
4use crate::macros::lua_c_init::luaC_init;
5use crate::macros::lua_m_newarray::luaM_newarray;
6use crate::records::lua_node::LuaNode;
7use crate::records::lua_table::LuaTable;
8use crate::type_aliases::lua_state::lua_State;
9use crate::type_aliases::t_value::TValue;
10use core::ffi::c_int;
11
12#[inline]
13unsafe fn maybesetaboundary(t: *mut LuaTable, boundary: c_int) {
14 if (*t).union.aboundary <= 0 {
15 (*t).union.aboundary = -boundary;
16 }
17}
18
19#[allow(non_snake_case)]
20pub unsafe fn lua_h_clone(l: *mut lua_State, tt: *mut LuaTable) -> *mut LuaTable {
21 let t = crate::functions::lua_m_newgco::luaM_newgco_(
22 l,
23 core::mem::size_of::<LuaTable>(),
24 (*l).activememcat,
25 ) as *mut LuaTable;
26
27 luaC_init!(l, t, lua_Type::LUA_TTABLE as c_int);
28 (*t).metatable = (*tt).metatable;
29 (*t).tmcache = (*tt).tmcache;
30 (*t).array = core::ptr::null_mut();
31 (*t).sizearray = 0;
32 (*t).lsizenode = 0;
33 (*t).nodemask8 = 0;
34 (*t).readonly = 0;
35 (*t).safeenv = 0;
36 (*t).node = dummynode as *mut LuaNode;
37 (*t).union.lastfree = 0;
38
39 if (*tt).sizearray != 0 {
40 (*t).array = luaM_newarray!(l, (*tt).sizearray as usize, TValue, (*t).memcat);
41 maybesetaboundary(t, getaboundary(tt));
42 (*t).sizearray = (*tt).sizearray;
43
44 core::ptr::copy_nonoverlapping((*tt).array, (*t).array, (*t).sizearray as usize);
45 }
46
47 if (*tt).node != dummynode as *mut LuaNode {
48 let size = 1i32 << (*tt).lsizenode;
49 (*t).node = luaM_newarray!(l, size as usize, LuaNode, (*t).memcat);
50 (*t).lsizenode = (*tt).lsizenode;
51 (*t).nodemask8 = (*tt).nodemask8;
52 core::ptr::copy_nonoverlapping((*tt).node, (*t).node, size as usize);
53 (*t).union.lastfree = (*tt).union.lastfree;
54 }
55
56 t
57}
58
59#[allow(unused_imports)]
60pub use lua_h_clone as luaH_clone;
61
62#[export_name = "luaH_clone"]
63pub unsafe extern "C" fn lua_h_clone_export(
64 l: *mut lua_State,
65 tt: *mut core::ffi::c_void,
66) -> *mut core::ffi::c_void {
67 lua_h_clone(l, tt as *mut LuaTable).cast()
68}