Skip to main content

luaur_repl_cli/functions/
counters_value_callback.rs

1use core::ffi::c_void;
2
3use luaur_code_gen::enums::code_gen_counter::CodeGenCounter;
4
5use crate::records::line_counters::LineCounters;
6use crate::records::module_counters::ModuleCounters;
7
8// Faithful port of Counters.cpp's `countersValueCallback`.
9pub unsafe fn counters_value_callback(context: *mut c_void, kind: i32, line: i32, hits: u64) {
10    let counters = &mut *(context as *mut ModuleCounters);
11    let function = counters
12        .functions
13        .last_mut()
14        .expect("countersValueCallback called before countersFunctionCallback");
15
16    let entry = function
17        .counters
18        .entry(line)
19        .or_insert_with(LineCounters::default);
20
21    if kind == CodeGenCounter::RegularBlockExecuted as i32 {
22        entry.regularExecuted += hits;
23    } else if kind == CodeGenCounter::FallbackBlockExecuted as i32 {
24        entry.fallbackExecuted += hits;
25    } else if kind == CodeGenCounter::VmExitTaken as i32 {
26        entry.vmExitTaken += hits;
27    }
28}