Skip to main content

luaur_vm/functions/
lua_getcoverage.rs

1use crate::functions::getcoverage::getcoverage;
2use crate::functions::getmaxline::getmaxline;
3use crate::functions::lua_a_toobject::luaA_toobject;
4use crate::macros::api_check::api_check;
5use crate::macros::clvalue::clvalue;
6use crate::macros::lua_m_freearray::luaM_freearray;
7use crate::macros::lua_m_newarray::luaM_newarray;
8use crate::macros::ttisfunction::ttisfunction;
9use crate::records::proto::Proto;
10use crate::type_aliases::lua_coverage::lua_Coverage;
11use crate::type_aliases::lua_state::lua_State;
12use crate::type_aliases::t_value::TValue;
13
14#[allow(non_snake_case)]
15pub unsafe fn lua_getcoverage(
16    L: *mut lua_State,
17    funcindex: core::ffi::c_int,
18    context: *mut core::ffi::c_void,
19    callback: lua_Coverage,
20) {
21    let func: *const TValue = luaA_toobject(L, funcindex);
22    api_check!(L, ttisfunction!(func) && (*clvalue!(func)).isC == 0);
23
24    let cl = clvalue!(func);
25    let lcl = core::ptr::addr_of!((*cl).inner.l).cast::<crate::records::closure::LClosure>();
26    let p = (*lcl).p as *mut Proto;
27
28    let size = getmaxline(p) as usize + 1;
29    if size == 0 {
30        return;
31    }
32
33    let buffer = luaM_newarray!(L, size, core::ffi::c_int, 0);
34
35    getcoverage(p, 0, buffer, size, context, callback);
36
37    luaM_freearray!(
38        L,
39        buffer as *mut core::ffi::c_void,
40        size,
41        core::ffi::c_int,
42        0
43    );
44}