luaur_analysis/methods/cfg_builder_make_cfg.rs
1//! Source: `Analysis/src/ControlFlowGraph.cpp:135-143` (hand-ported)
2//! C++ `std::unique_ptr<ControlFlowGraph> CFGBuilder::makeCFG(NotNull<CFGAllocator> allocator, AstStatBlock* block)`.
3use crate::records::cfg_allocator::CfgAllocator;
4use crate::records::cfg_builder::CfgBuilder;
5use crate::records::control_flow_graph::ControlFlowGraph;
6use luaur_ast::records::ast_stat_block::AstStatBlock;
7use luaur_common::FFlag;
8
9impl CfgBuilder {
10 pub fn make_cfg(
11 allocator: *mut CfgAllocator,
12 block: *mut AstStatBlock,
13 ) -> *mut ControlFlowGraph {
14 // C++:
15 // CFGBuilder builder(allocator);
16 // builder.lower(block);
17 let mut builder = CfgBuilder::new(allocator);
18 // `block` is `AstStatBlock*`; C++ `lower(block)` dispatches to the
19 // `AstStatBlock*` overload.
20 builder.lower_ast_stat_block(block);
21
22 // auto cfg = std::move(builder.cfg);
23 let cfg = builder.cfg.take().unwrap();
24
25 // if (FFlag::DebugLuauFreezeArena) allocator->freeze();
26 if FFlag::DebugLuauFreezeArena.get() {
27 unsafe { (*allocator).freeze() };
28 }
29
30 // return cfg; (unique_ptr -> raw owning pointer)
31 alloc::boxed::Box::into_raw(alloc::boxed::Box::new(cfg))
32 }
33}