luaur_vm/functions/
lua_s_resize.rs1use crate::macros::lmod::lmod;
2use crate::macros::lua_m_freearray::luaM_freearray;
3use crate::macros::lua_m_newarray::luaM_newarray;
4use crate::records::stringtable::stringtable;
5use crate::records::t_string::TString;
6use crate::type_aliases::lua_state::lua_State;
7use core::ffi::c_int;
8use luaur_common::macros::luau_assert::LUAU_ASSERT;
9
10#[allow(non_snake_case)]
11pub unsafe fn luaS_resize(l: *mut lua_State, newsize: c_int) {
12 let newhash = luaM_newarray!(l, newsize as usize, *mut TString, 0);
13 let tb: *mut stringtable = core::ptr::addr_of_mut!((*(*l).global).strt);
14
15 let mut i = 0;
16 while i < newsize {
17 *newhash.add(i as usize) = core::ptr::null_mut();
18 i += 1;
19 }
20
21 i = 0;
22 while i < (*tb).size {
23 let mut p = *(*tb).hash.add(i as usize);
24 while !p.is_null() {
25 let next = (*p).next;
26 let h = (*p).hash;
27 let h1 = lmod!(h, newsize) as c_int;
28 LUAU_ASSERT!((h % newsize as u32) as c_int == lmod!(h, newsize));
29 (*p).next = *newhash.add(h1 as usize);
30 *newhash.add(h1 as usize) = p;
31 p = next;
32 }
33 i += 1;
34 }
35
36 luaM_freearray!(l, (*tb).hash, (*tb).size as usize, *mut TString, 0);
37 (*tb).size = newsize;
38 (*tb).hash = newhash;
39}
40
41#[allow(unused_imports)]
42pub use luaS_resize as lua_s_resize;