Skip to main content

luaur_vm/functions/
lua_m_freearray.rs

1use crate::functions::lua_g_getline::luaG_getline;
2use crate::macros::getstr::getstr;
3use crate::type_aliases::lua_counter_function::lua_CounterFunction;
4use crate::type_aliases::lua_counter_value::lua_CounterValue;
5use crate::type_aliases::lua_state::lua_State;
6use crate::type_aliases::proto::Proto;
7
8#[allow(non_snake_case)]
9pub(crate) unsafe fn getcounters(
10    L: *mut lua_State,
11    p: *mut Proto,
12    context: *mut core::ffi::c_void,
13    functionvisit: lua_CounterFunction,
14    countervisit: lua_CounterValue,
15) {
16    let p_ref = &*p;
17    if !p_ref.execdata.is_null() {
18        let l_ref = &*L;
19        let global = l_ref.global;
20        if !global.is_null() && !(*global).ecb.getcounterdata.is_none() {
21            let mut count: usize = 0;
22            let data = (*global).ecb.getcounterdata.unwrap()(L, p, &mut count as *mut usize);
23
24            if !data.is_null() && count != 0 {
25                let debugname = if !p_ref.debugname.is_null() {
26                    getstr(p_ref.debugname)
27                } else {
28                    core::ptr::null()
29                };
30                let linedefined = p_ref.linedefined;
31
32                if let Some(mut fv) = functionvisit {
33                    fv(context, debugname, linedefined);
34                }
35
36                for i in 0..count {
37                    let mut kind: u32 = 0;
38                    let mut pcpos: u32 = 0;
39                    let mut hits: u64 = 0;
40
41                    let ptr = (data as *const u8).add(i * (4 + 4 + 8));
42                    kind = core::ptr::read_unaligned(ptr as *const u32);
43                    pcpos = core::ptr::read_unaligned(ptr.add(4) as *const u32);
44                    hits = core::ptr::read_unaligned(ptr.add(8) as *const u64);
45
46                    let line = if pcpos == !0u32 {
47                        p_ref.linedefined
48                    } else {
49                        luaG_getline(p, pcpos as i32)
50                    };
51
52                    if let Some(mut cv) = countervisit {
53                        cv(context, kind as i32, line, hits);
54                    }
55                }
56            }
57        }
58    }
59
60    for i in 0..p_ref.sizep {
61        let child = *p_ref.p.add(i as usize);
62        getcounters(L, child, context, functionvisit, countervisit);
63    }
64}
65
66#[allow(non_snake_case)]
67pub unsafe fn lua_m_freearray(
68    L: *mut lua_State,
69    buffer: *mut core::ffi::c_void,
70    size: usize,
71    elem_size: usize,
72    memcat: u8,
73) {
74    // In this translation unit, we only need the debug counter traversal logic.
75    // The actual luaM_freearray semantics are handled by lower-level memory helpers elsewhere.
76    // Kept intentionally minimal to match the provided schedule slice.
77    let _ = (L, buffer, size, elem_size, memcat);
78}