Skip to main content

luaur_vm/functions/
lua_m_free.rs

1use crate::functions::freeblock::freeblock;
2use crate::type_aliases::lua_state::lua_State;
3use core::ffi::c_void;
4use luaur_common::macros::luau_assert::LUAU_ASSERT;
5
6#[allow(non_snake_case)]
7pub unsafe fn luaM_free_(l: *mut lua_State, block: *mut c_void, osize: usize, memcat: u8) {
8    let g = (*l).global;
9    LUAU_ASSERT!((osize == 0) == block.is_null());
10
11    let sizeclass = |size: usize| -> i32 {
12        if size == 0 || size > 1024 {
13            -1
14        } else if size <= 56 {
15            ((size + 7) / 8 - 1) as i32
16        } else if size <= 240 {
17            (7 + (size - 49) / 16) as i32
18        } else if size <= 480 {
19            (19 + (size - 225) / 32) as i32
20        } else {
21            (27 + (size - 449) / 64) as i32
22        }
23    };
24
25    let oclass = sizeclass(osize);
26
27    if oclass >= 0 {
28        freeblock(l, oclass, block);
29    } else if let Some(frealloc) = (*g).frealloc {
30        frealloc((*g).ud, block, osize, 0);
31    }
32
33    (*g).totalbytes = (*g).totalbytes.wrapping_sub(osize);
34    let memcatbytes = core::ptr::addr_of_mut!((*g).memcatbytes) as *mut usize;
35    *memcatbytes.add(memcat as usize) = (*memcatbytes.add(memcat as usize)).wrapping_sub(osize);
36}