Skip to main content

luaur_vm/functions/
setarrayvector.rs

1use crate::enums::lua_status::lua_Status;
2use crate::functions::lua_d_throw_ldo::luaD_throw;
3use crate::functions::lua_g_pusherror::lua_g_pusherror;
4use crate::functions::lua_m_realloc::lua_m_realloc_;
5use crate::macros::setnilvalue::setnilvalue;
6use crate::records::lua_table::LuaTable;
7use crate::type_aliases::lua_state::lua_State;
8use crate::type_aliases::t_value::TValue;
9use core::ffi::c_int;
10
11const MAXSIZE: c_int = 1 << 26;
12
13unsafe fn runerror(l: *mut lua_State, msg: *const core::ffi::c_char) -> ! {
14    lua_g_pusherror(l, msg);
15    luaD_throw(l, lua_Status::LUA_ERRRUN as c_int);
16}
17
18#[allow(non_snake_case)]
19pub unsafe fn setarrayvector(l: *mut lua_State, t: *mut LuaTable, size: c_int) {
20    if size > MAXSIZE {
21        runerror(l, c"table overflow".as_ptr());
22    }
23
24    let oldsize = (*t).sizearray;
25    let newarray = lua_m_realloc_(
26        l,
27        (*t).array as *mut core::ffi::c_void,
28        oldsize as usize * core::mem::size_of::<TValue>(),
29        size as usize * core::mem::size_of::<TValue>(),
30        (*t).memcat,
31    ) as *mut TValue;
32
33    (*t).array = newarray;
34
35    let mut i = oldsize;
36    while i < size {
37        setnilvalue!((*t).array.add(i as usize));
38        i += 1;
39    }
40
41    (*t).sizearray = size;
42}