Skip to main content

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}