Skip to main content

luaur_code_gen/functions/
summarize_bytecode.rs

1use alloc::vec::Vec;
2use luaur_common::enums::luau_proto_flag::LuauProtoFlag;
3use luaur_vm::functions::lua_a_toobject::luaA_toobject;
4use luaur_vm::functions::lua_is_lfunction::lua_is_lfunction;
5use luaur_vm::macros::clvalue::clvalue;
6use luaur_vm::records::proto::Proto;
7use luaur_vm::type_aliases::lua_state::lua_State;
8use luaur_vm::type_aliases::t_value::TValue;
9
10use crate::enums::code_gen_flags::CodeGenFlags;
11use crate::functions::gather_functions::gather_functions;
12use crate::macros::codegen_assert::CODEGEN_ASSERT;
13use crate::records::function_bytecode_summary::FunctionBytecodeSummary;
14
15pub fn summarize_bytecode(
16    L: *mut lua_State,
17    idx: i32,
18    nesting_limit: u32,
19) -> Vec<FunctionBytecodeSummary> {
20    unsafe {
21        CODEGEN_ASSERT!(lua_is_lfunction(L, idx) != 0);
22        let func: *const TValue = luaA_toobject(L, idx);
23
24        let cl = clvalue!(func);
25        let root: *mut Proto = (*(*cl).inner.l).p;
26
27        let mut protos: Vec<*mut Proto> = Vec::new();
28        gather_functions(
29            &mut protos,
30            root,
31            CodeGenFlags::CodeGen_ColdFunctions as u32,
32            ((*root).flags & LuauProtoFlag::LPF_NATIVE_FUNCTION as u8) != 0,
33        );
34
35        let mut summaries: Vec<FunctionBytecodeSummary> = Vec::with_capacity(protos.len());
36
37        for proto in protos {
38            if !proto.is_null() {
39                summaries.push(FunctionBytecodeSummary::from_proto(proto, nesting_limit));
40            }
41        }
42
43        summaries
44    }
45}