gbf_core/decompiler/structure_analysis/
vbranch.rs1#![deny(missing_docs)]
2
3use std::backtrace::Backtrace;
4
5use crate::decompiler::ast::new_virtual_branch;
6
7use super::{
8 RegionReducer, StructureAnalysis, StructureAnalysisError,
9 region::{RegionId, RegionType},
10};
11
12pub struct VirtualBranchReducer;
14
15impl VirtualBranchReducer {}
16
17impl RegionReducer for VirtualBranchReducer {
18 fn reduce_region(
19 &mut self,
20 analysis: &mut StructureAnalysis,
21 region_id: RegionId,
22 ) -> Result<bool, StructureAnalysisError> {
23 if analysis.get_region_type(region_id)? != RegionType::Linear {
25 return Ok(false);
26 }
27
28 let successor_id = analysis.get_single_successor(region_id)?.ok_or_else(|| {
30 StructureAnalysisError::Other {
31 message: "Linear region does not have exactly one successor".to_string(),
32 backtrace: Backtrace::capture(),
33 }
34 })?;
35 let vbranch = new_virtual_branch(successor_id);
37 let region = analysis.get_region_mut(region_id)?;
38 region.push_node(vbranch.into());
39 region.set_region_type(RegionType::Tail);
40 analysis.remove_edge(region_id, successor_id)?;
41 Ok(true)
42 }
43}