Skip to main content

luaur_vm/functions/
lua_m_new.rs

1use crate::enums::lua_status::lua_Status;
2use crate::functions::lua_d_throw_ldo::luaD_throw;
3use crate::functions::newblock::newblock;
4use crate::type_aliases::lua_state::lua_State;
5use core::ffi::c_void;
6
7#[inline]
8fn sizeclass(size: usize) -> i32 {
9    if size == 0 || size > 1024 {
10        -1
11    } else if size <= 56 {
12        ((size + 7) / 8 - 1) as i32
13    } else if size <= 240 {
14        (7 + (size - 49) / 16) as i32
15    } else if size <= 480 {
16        (19 + (size - 225) / 32) as i32
17    } else {
18        (27 + (size - 449) / 64) as i32
19    }
20}
21
22#[allow(non_snake_case)]
23pub unsafe fn luaM_new_(l: *mut lua_State, nsize: usize, memcat: u8) -> *mut c_void {
24    let g = (*l).global;
25    let nclass = sizeclass(nsize);
26
27    let block = if nclass >= 0 {
28        newblock(l, nclass)
29    } else if let Some(frealloc) = (*g).frealloc {
30        frealloc((*g).ud, core::ptr::null_mut(), 0, nsize)
31    } else {
32        core::ptr::null_mut()
33    };
34
35    if block.is_null() && nsize > 0 {
36        luaD_throw(l, lua_Status::LUA_ERRMEM as i32);
37    }
38
39    (*g).totalbytes = (*g).totalbytes.wrapping_add(nsize);
40    (*g).memcatbytes[memcat as usize] = (*g).memcatbytes[memcat as usize].wrapping_add(nsize);
41
42    if let Some(onallocate) = (*g).cb.onallocate {
43        onallocate(l, 0, nsize);
44    }
45
46    block
47}
48
49#[allow(unused_imports)]
50pub use luaM_new_ as lua_m_new_;