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