luaur_code_gen/functions/
gather_functions_helper.rs1use 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}