smpl/analysis/
control_data.rs1use crate::span::Span;
2
3use super::semantic_data::{BranchingId, LoopId};
4use super::typed_ast;
5
6#[derive(Clone, Debug)]
7pub struct BasicBlock {
8 graph: Vec<BlockNode>,
9}
10
11impl BasicBlock {
12 pub fn new() -> BasicBlock {
13 BasicBlock { graph: Vec::new() }
14 }
15
16 pub fn append(&mut self, node: BlockNode) {
17 self.graph.push(node);
18 }
19
20 pub fn start(&self) -> usize {
21 0
22 }
23
24 pub fn end(&self) -> usize {
25 self.graph.len() - 1
26 }
27
28 pub fn graph(&self) -> &[BlockNode] {
29 &self.graph
30 }
31
32 pub fn graph_mut(&mut self) -> &mut [BlockNode] {
33 &mut self.graph
34 }
35
36 pub fn len(&self) -> usize {
37 self.graph.len()
38 }
39
40 pub fn is_empty(&self) -> bool {
41 self.graph.len() == 0
42 }
43}
44
45#[derive(Clone, Debug)]
46pub enum BlockNode {
47 Expr(ExprData),
48
49 Assignment(AssignmentData),
50 LocalVarDecl(LocalVarDeclData),
51}
52
53#[derive(Clone, Debug)]
54pub enum Node {
55 Start,
56 End,
57
58 EnterScope,
59 ExitScope,
60
61 Return(ReturnData),
62 Break(LoopData),
63 Continue(LoopData),
64
65 BranchSplit(BranchingData, ExprData),
66 BranchMerge(BranchingData),
67
68 LoopHead(LoopData, ExprData),
69 LoopFoot(LoopData),
70
71 Block(BasicBlock),
72}
73
74#[derive(Clone, Debug)]
75pub enum Edge {
76 Normal,
77 True,
78 False,
79 BackEdge,
80}
81
82#[derive(Debug, Clone)]
83pub struct BranchingData {
84 pub branch_id: BranchingId,
85}
86
87#[derive(Debug, Clone)]
88pub struct ExprData {
89 pub expr: typed_ast::Expr,
90 pub span: Span,
91}
92
93#[derive(Debug, Clone)]
94pub struct AssignmentData {
95 pub assignment: typed_ast::Assignment,
96 pub span: Span,
97}
98
99#[derive(Debug, Clone)]
100pub struct LocalVarDeclData {
101 pub decl: typed_ast::LocalVarDecl,
102 pub span: Span,
103}
104
105#[derive(Debug, Clone)]
106pub struct LoopData {
107 pub loop_id: LoopId,
108 pub span: Span,
109}
110
111#[derive(Debug, Clone)]
112pub struct ReturnData {
113 pub expr: Option<typed_ast::Expr>,
114 pub span: Span,
115}