Skip to main content

luaur_code_gen/functions/
gather_functions_helper.rs

1use crate::enums::code_gen_flags::CodeGenFlags;
2use alloc::vec::Vec;
3use luaur_vm::records::proto::Proto;
4
5pub fn gather_functions_helper(
6    results: &mut Vec<*mut Proto>,
7    proto: *mut Proto,
8    flags: u32,
9    has_native_functions: bool,
10    root: bool,
11) {
12    let proto_ref = unsafe { &*proto };
13
14    if results.len() <= proto_ref.bytecodeid as usize {
15        results.resize(proto_ref.bytecodeid as usize + 1, core::ptr::null_mut());
16    }
17
18    if !results[proto_ref.bytecodeid as usize].is_null() {
19        return;
20    }
21
22    let lpf_native_function = 1 << 0;
23    let lpf_native_cold = 1 << 1;
24
25    let should_gather = if has_native_functions {
26        !root && (proto_ref.flags as u32 & lpf_native_function) != 0
27    } else {
28        (proto_ref.flags as u32 & lpf_native_cold) == 0
29            || (flags & (CodeGenFlags::CodeGen_ColdFunctions as u32)) != 0
30    };
31
32    if should_gather {
33        results[proto_ref.bytecodeid as usize] = proto;
34    }
35
36    for i in 0..proto_ref.sizep as usize {
37        let child_proto = unsafe { *proto_ref.p.add(i) };
38        gather_functions_helper(results, child_proto, flags, has_native_functions, false);
39    }
40}