Skip to main content

luaur_vm/functions/
lua_s_resize.rs

1use 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;