Skip to main content

smpl/analysis/
control_data.rs

1use 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}