mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
feat(semantic/cfg): propagate unreachable edges through subgraphs. (#3648)
From this:  To this: 
This commit is contained in:
parent
d9c5b33394
commit
9c31ed9178
22 changed files with 100 additions and 60 deletions
|
|
@ -5,7 +5,10 @@ use oxc_allocator::Allocator;
|
||||||
use oxc_parser::Parser;
|
use oxc_parser::Parser;
|
||||||
use oxc_semantic::{DebugDot, DisplayDot, EdgeType, SemanticBuilder};
|
use oxc_semantic::{DebugDot, DisplayDot, EdgeType, SemanticBuilder};
|
||||||
use oxc_span::SourceType;
|
use oxc_span::SourceType;
|
||||||
use petgraph::dot::{Config, Dot};
|
use petgraph::{
|
||||||
|
dot::{Config, Dot},
|
||||||
|
visit::EdgeRef,
|
||||||
|
};
|
||||||
|
|
||||||
// Instruction:
|
// Instruction:
|
||||||
// 1. create a `test.js`,
|
// 1. create a `test.js`,
|
||||||
|
|
@ -91,7 +94,9 @@ fn main() -> std::io::Result<()> {
|
||||||
&|_graph, edge| {
|
&|_graph, edge| {
|
||||||
let weight = edge.weight();
|
let weight = edge.weight();
|
||||||
let label = format!("label = \"{weight:?}\"");
|
let label = format!("label = \"{weight:?}\"");
|
||||||
if matches!(weight, EdgeType::Unreachable) {
|
if matches!(weight, EdgeType::Unreachable)
|
||||||
|
|| semantic.semantic.cfg().basic_block(edge.source()).unreachable
|
||||||
|
{
|
||||||
format!("{label}, style = \"dotted\" ")
|
format!("{label}, style = \"dotted\" ")
|
||||||
} else {
|
} else {
|
||||||
label
|
label
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ use crate::ReturnInstructionKind;
|
||||||
use context::Ctx;
|
use context::Ctx;
|
||||||
|
|
||||||
pub use context::{CtxCursor, CtxFlags};
|
pub use context::{CtxCursor, CtxFlags};
|
||||||
|
use petgraph::Direction;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
AstNodeId, BasicBlock, BasicBlockId, CompactStr, ControlFlowGraph, EdgeType, ErrorEdgeKind,
|
AstNodeId, BasicBlock, BasicBlockId, CompactStr, ControlFlowGraph, EdgeType, ErrorEdgeKind,
|
||||||
|
|
@ -56,6 +57,17 @@ impl<'a> ControlFlowGraphBuilder<'a> {
|
||||||
self.basic_block_mut(self.current_node_ix)
|
self.basic_block_mut(self.current_node_ix)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// # Panics
|
||||||
|
pub fn basic_block(&self, basic_block: BasicBlockId) -> &BasicBlock {
|
||||||
|
let idx = *self
|
||||||
|
.graph
|
||||||
|
.node_weight(basic_block)
|
||||||
|
.expect("expected `self.current_node_ix` to be a valid node index in self.graph");
|
||||||
|
self.basic_blocks
|
||||||
|
.get(idx)
|
||||||
|
.expect("expected `self.current_node_ix` to be a valid node index in self.graph")
|
||||||
|
}
|
||||||
|
|
||||||
/// # Panics
|
/// # Panics
|
||||||
pub fn basic_block_mut(&mut self, basic_block: BasicBlockId) -> &mut BasicBlock {
|
pub fn basic_block_mut(&mut self, basic_block: BasicBlockId) -> &mut BasicBlock {
|
||||||
let idx = *self
|
let idx = *self
|
||||||
|
|
@ -99,6 +111,20 @@ impl<'a> ControlFlowGraphBuilder<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_edge(&mut self, a: BasicBlockId, b: BasicBlockId, weight: EdgeType) {
|
pub fn add_edge(&mut self, a: BasicBlockId, b: BasicBlockId, weight: EdgeType) {
|
||||||
|
if matches!(weight, EdgeType::NewFunction) {
|
||||||
|
self.basic_block_mut(b).unreachable = false;
|
||||||
|
} else if self.basic_block(a).unreachable {
|
||||||
|
if self.graph.edges_directed(b, Direction::Incoming).count() == 0 {
|
||||||
|
self.basic_block_mut(b).unreachable = true;
|
||||||
|
}
|
||||||
|
} else if !self
|
||||||
|
.basic_block(b)
|
||||||
|
.instructions()
|
||||||
|
.iter()
|
||||||
|
.any(|it| matches!(it, Instruction { kind: InstructionKind::Unreachable, .. }))
|
||||||
|
{
|
||||||
|
self.basic_block_mut(b).unreachable = false;
|
||||||
|
}
|
||||||
self.graph.add_edge(a, b, weight);
|
self.graph.add_edge(a, b, weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -193,12 +219,13 @@ impl<'a> ControlFlowGraphBuilder<'a> {
|
||||||
pub fn append_unreachable(&mut self) {
|
pub fn append_unreachable(&mut self) {
|
||||||
let current_node_ix = self.current_node_ix;
|
let current_node_ix = self.current_node_ix;
|
||||||
let basic_block_with_unreachable_graph_ix = self.new_basic_block_normal();
|
let basic_block_with_unreachable_graph_ix = self.new_basic_block_normal();
|
||||||
|
self.push_instruction(InstructionKind::Unreachable, None);
|
||||||
|
self.current_basic_block().unreachable = true;
|
||||||
self.add_edge(
|
self.add_edge(
|
||||||
current_node_ix,
|
current_node_ix,
|
||||||
basic_block_with_unreachable_graph_ix,
|
basic_block_with_unreachable_graph_ix,
|
||||||
EdgeType::Unreachable,
|
EdgeType::Unreachable,
|
||||||
);
|
);
|
||||||
self.push_instruction(InstructionKind::Unreachable, None);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,10 @@ use oxc_ast::{
|
||||||
AstKind,
|
AstKind,
|
||||||
};
|
};
|
||||||
use oxc_syntax::node::AstNodeId;
|
use oxc_syntax::node::AstNodeId;
|
||||||
use petgraph::dot::{Config, Dot};
|
use petgraph::{
|
||||||
|
dot::{Config, Dot},
|
||||||
|
visit::EdgeRef,
|
||||||
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
AstNode, AstNodes, BasicBlock, ControlFlowGraph, EdgeType, Instruction, InstructionKind,
|
AstNode, AstNodes, BasicBlock, ControlFlowGraph, EdgeType, Instruction, InstructionKind,
|
||||||
|
|
@ -56,7 +59,9 @@ impl DisplayDot for ControlFlowGraph {
|
||||||
&|_graph, edge| {
|
&|_graph, edge| {
|
||||||
let weight = edge.weight();
|
let weight = edge.weight();
|
||||||
let label = format!("label = \"{weight:?}\" ");
|
let label = format!("label = \"{weight:?}\" ");
|
||||||
if matches!(weight, EdgeType::Unreachable) {
|
if matches!(weight, EdgeType::Unreachable)
|
||||||
|
|| self.basic_block(edge.source()).unreachable
|
||||||
|
{
|
||||||
format!("{label}, style = \"dotted\" ")
|
format!("{label}, style = \"dotted\" ")
|
||||||
} else {
|
} else {
|
||||||
label
|
label
|
||||||
|
|
@ -115,7 +120,9 @@ impl DebugDot for ControlFlowGraph {
|
||||||
&|_graph, edge| {
|
&|_graph, edge| {
|
||||||
let weight = edge.weight();
|
let weight = edge.weight();
|
||||||
let label = format!("label = \"{weight:?}\" ");
|
let label = format!("label = \"{weight:?}\" ");
|
||||||
if matches!(weight, EdgeType::Unreachable) {
|
if matches!(weight, EdgeType::Unreachable)
|
||||||
|
|| self.basic_block(edge.source()).unreachable
|
||||||
|
{
|
||||||
format!("{label}, style = \"dotted\" ")
|
format!("{label}, style = \"dotted\" ")
|
||||||
} else {
|
} else {
|
||||||
label
|
label
|
||||||
|
|
|
||||||
|
|
@ -116,11 +116,12 @@ pub enum CallType {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct BasicBlock {
|
pub struct BasicBlock {
|
||||||
pub instructions: Vec<Instruction>,
|
pub instructions: Vec<Instruction>,
|
||||||
|
pub unreachable: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BasicBlock {
|
impl BasicBlock {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
BasicBlock { instructions: Vec::new() }
|
BasicBlock { instructions: Vec::new(), unreachable: false }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn instructions(&self) -> &Vec<Instruction> {
|
pub fn instructions(&self) -> &Vec<Instruction> {
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ digraph {
|
||||||
2 [ label = "unreachable" ]
|
2 [ label = "unreachable" ]
|
||||||
3 [ label = "" ]
|
3 [ label = "" ]
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
2 -> 0 [ label = "Error(Implicit)" ]
|
2 -> 0 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
1 -> 2 [ label = "Unreachable" , style = "dotted" ]
|
1 -> 2 [ label = "Unreachable" , style = "dotted" ]
|
||||||
3 -> 0 [ label = "Error(Implicit)" ]
|
3 -> 0 [ label = "Error(Implicit)" ]
|
||||||
2 -> 3 [ label = "Normal" ]
|
2 -> 3 [ label = "Normal" , style = "dotted" ]
|
||||||
1 -> 3 [ label = "Jump" ]
|
1 -> 3 [ label = "Jump" ]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 5 [ label = "Normal" ]
|
1 -> 5 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -25,14 +25,14 @@ digraph {
|
||||||
6 -> 2 [ label = "Error(Implicit)" ]
|
6 -> 2 [ label = "Error(Implicit)" ]
|
||||||
4 -> 6 [ label = "Normal" ]
|
4 -> 6 [ label = "Normal" ]
|
||||||
7 -> 2 [ label = "Error(Implicit)" ]
|
7 -> 2 [ label = "Error(Implicit)" ]
|
||||||
8 -> 2 [ label = "Error(Implicit)" ]
|
8 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
||||||
9 -> 2 [ label = "Error(Implicit)" ]
|
9 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
10 -> 2 [ label = "Error(Implicit)" ]
|
10 -> 2 [ label = "Error(Implicit)" ]
|
||||||
6 -> 7 [ label = "Normal" ]
|
6 -> 7 [ label = "Normal" ]
|
||||||
8 -> 9 [ label = "Normal" ]
|
8 -> 9 [ label = "Normal" , style = "dotted" ]
|
||||||
9 -> 10 [ label = "Normal" ]
|
9 -> 10 [ label = "Normal" , style = "dotted" ]
|
||||||
9 -> 7 [ label = "Backedge" ]
|
9 -> 7 [ label = "Backedge" , style = "dotted" ]
|
||||||
7 -> 10 [ label = "Jump" ]
|
7 -> 10 [ label = "Jump" ]
|
||||||
11 -> 2 [ label = "Error(Implicit)" ]
|
11 -> 2 [ label = "Error(Implicit)" ]
|
||||||
3 -> 5 [ label = "Normal" ]
|
3 -> 5 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 5 [ label = "Normal" ]
|
1 -> 5 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -28,18 +28,18 @@ digraph {
|
||||||
4 -> 6 [ label = "Normal" ]
|
4 -> 6 [ label = "Normal" ]
|
||||||
5 -> 6 [ label = "Normal" ]
|
5 -> 6 [ label = "Normal" ]
|
||||||
7 -> 2 [ label = "Error(Implicit)" ]
|
7 -> 2 [ label = "Error(Implicit)" ]
|
||||||
8 -> 2 [ label = "Error(Implicit)" ]
|
8 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
||||||
9 -> 2 [ label = "Error(Implicit)" ]
|
9 -> 2 [ label = "Error(Implicit)" ]
|
||||||
10 -> 2 [ label = "Error(Implicit)" ]
|
10 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
9 -> 10 [ label = "Unreachable" , style = "dotted" ]
|
9 -> 10 [ label = "Unreachable" , style = "dotted" ]
|
||||||
11 -> 2 [ label = "Error(Implicit)" ]
|
11 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Normal" ]
|
3 -> 4 [ label = "Normal" ]
|
||||||
8 -> 11 [ label = "Normal" ]
|
8 -> 11 [ label = "Normal" , style = "dotted" ]
|
||||||
6 -> 7 [ label = "Jump" ]
|
6 -> 7 [ label = "Jump" ]
|
||||||
3 -> 9 [ label = "Normal" ]
|
3 -> 9 [ label = "Normal" ]
|
||||||
10 -> 11 [ label = "Normal" ]
|
10 -> 11 [ label = "Normal" , style = "dotted" ]
|
||||||
12 -> 2 [ label = "Error(Implicit)" ]
|
12 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
11 -> 12 [ label = "Unreachable" , style = "dotted" ]
|
11 -> 12 [ label = "Unreachable" , style = "dotted" ]
|
||||||
13 -> 0 [ label = "Error(Implicit)" ]
|
13 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 13 [ label = "Normal" ]
|
1 -> 13 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -30,21 +30,21 @@ digraph {
|
||||||
6 -> 2 [ label = "Error(Implicit)" ]
|
6 -> 2 [ label = "Error(Implicit)" ]
|
||||||
7 -> 2 [ label = "Error(Implicit)" ]
|
7 -> 2 [ label = "Error(Implicit)" ]
|
||||||
8 -> 2 [ label = "Error(Implicit)" ]
|
8 -> 2 [ label = "Error(Implicit)" ]
|
||||||
9 -> 2 [ label = "Error(Implicit)" ]
|
9 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
8 -> 9 [ label = "Unreachable" , style = "dotted" ]
|
8 -> 9 [ label = "Unreachable" , style = "dotted" ]
|
||||||
10 -> 2 [ label = "Error(Implicit)" ]
|
10 -> 2 [ label = "Error(Implicit)" ]
|
||||||
11 -> 2 [ label = "Error(Implicit)" ]
|
11 -> 2 [ label = "Error(Implicit)" ]
|
||||||
12 -> 2 [ label = "Error(Implicit)" ]
|
12 -> 2 [ label = "Error(Implicit)" ]
|
||||||
13 -> 2 [ label = "Error(Implicit)" ]
|
13 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
12 -> 13 [ label = "Unreachable" , style = "dotted" ]
|
12 -> 13 [ label = "Unreachable" , style = "dotted" ]
|
||||||
14 -> 2 [ label = "Error(Implicit)" ]
|
14 -> 2 [ label = "Error(Implicit)" ]
|
||||||
10 -> 11 [ label = "Normal" ]
|
10 -> 11 [ label = "Normal" ]
|
||||||
13 -> 14 [ label = "Normal" ]
|
13 -> 14 [ label = "Normal" , style = "dotted" ]
|
||||||
11 -> 12 [ label = "Jump" ]
|
11 -> 12 [ label = "Jump" ]
|
||||||
10 -> 14 [ label = "Normal" ]
|
10 -> 14 [ label = "Normal" ]
|
||||||
15 -> 2 [ label = "Error(Implicit)" ]
|
15 -> 2 [ label = "Error(Implicit)" ]
|
||||||
6 -> 7 [ label = "Normal" ]
|
6 -> 7 [ label = "Normal" ]
|
||||||
9 -> 15 [ label = "Normal" ]
|
9 -> 15 [ label = "Normal" , style = "dotted" ]
|
||||||
7 -> 8 [ label = "Jump" ]
|
7 -> 8 [ label = "Jump" ]
|
||||||
6 -> 10 [ label = "Normal" ]
|
6 -> 10 [ label = "Normal" ]
|
||||||
14 -> 15 [ label = "Normal" ]
|
14 -> 15 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -21,11 +21,11 @@ digraph {
|
||||||
2 -> 4 [ label = "Normal" ]
|
2 -> 4 [ label = "Normal" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
6 -> 0 [ label = "Error(Implicit)" ]
|
6 -> 0 [ label = "Error(Implicit)" ]
|
||||||
7 -> 0 [ label = "Error(Implicit)" ]
|
7 -> 0 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
6 -> 7 [ label = "Unreachable" , style = "dotted" ]
|
6 -> 7 [ label = "Unreachable" , style = "dotted" ]
|
||||||
8 -> 0 [ label = "Error(Implicit)" ]
|
8 -> 0 [ label = "Error(Implicit)" ]
|
||||||
4 -> 5 [ label = "Normal" ]
|
4 -> 5 [ label = "Normal" ]
|
||||||
7 -> 8 [ label = "Normal" ]
|
7 -> 8 [ label = "Normal" , style = "dotted" ]
|
||||||
5 -> 6 [ label = "Jump" ]
|
5 -> 6 [ label = "Jump" ]
|
||||||
4 -> 8 [ label = "Normal" ]
|
4 -> 8 [ label = "Normal" ]
|
||||||
9 -> 0 [ label = "Error(Implicit)" ]
|
9 -> 0 [ label = "Error(Implicit)" ]
|
||||||
|
|
|
||||||
|
|
@ -22,20 +22,20 @@ digraph {
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
5 -> 2 [ label = "Error(Implicit)" ]
|
5 -> 2 [ label = "Error(Implicit)" ]
|
||||||
5 -> 4 [ label = "Finalize" ]
|
5 -> 4 [ label = "Finalize" ]
|
||||||
6 -> 2 [ label = "Error(Implicit)" ]
|
6 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
6 -> 4 [ label = "Finalize" ]
|
6 -> 4 [ label = "Finalize" , style = "dotted" ]
|
||||||
5 -> 6 [ label = "Unreachable" , style = "dotted" ]
|
5 -> 6 [ label = "Unreachable" , style = "dotted" ]
|
||||||
7 -> 2 [ label = "Error(Implicit)" ]
|
7 -> 2 [ label = "Error(Implicit)" ]
|
||||||
4 -> 7 [ label = "Normal" ]
|
4 -> 7 [ label = "Normal" ]
|
||||||
8 -> 2 [ label = "Error(Implicit)" ]
|
8 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
||||||
9 -> 2 [ label = "Error(Implicit)" ]
|
9 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 5 [ label = "Normal" ]
|
3 -> 5 [ label = "Normal" ]
|
||||||
8 -> 9 [ label = "Join" ]
|
8 -> 9 [ label = "Join" , style = "dotted" ]
|
||||||
10 -> 2 [ label = "Error(Implicit)" ]
|
10 -> 2 [ label = "Error(Implicit)" ]
|
||||||
9 -> 10 [ label = "Normal" ]
|
9 -> 10 [ label = "Normal" , style = "dotted" ]
|
||||||
7 -> 10 [ label = "Jump" ]
|
7 -> 10 [ label = "Jump" ]
|
||||||
11 -> 2 [ label = "Error(Implicit)" ]
|
11 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
10 -> 11 [ label = "Unreachable" , style = "dotted" ]
|
10 -> 11 [ label = "Unreachable" , style = "dotted" ]
|
||||||
12 -> 0 [ label = "Error(Implicit)" ]
|
12 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 12 [ label = "Normal" ]
|
1 -> 12 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,9 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 2 [ label = "Error(Implicit)" ]
|
5 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
4 -> 5 [ label = "Unreachable" , style = "dotted" ]
|
4 -> 5 [ label = "Unreachable" , style = "dotted" ]
|
||||||
6 -> 0 [ label = "Error(Implicit)" ]
|
6 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 6 [ label = "Normal" ]
|
1 -> 6 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,9 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 2 [ label = "Error(Implicit)" ]
|
5 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
4 -> 5 [ label = "Unreachable" , style = "dotted" ]
|
4 -> 5 [ label = "Unreachable" , style = "dotted" ]
|
||||||
6 -> 0 [ label = "Error(Implicit)" ]
|
6 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 6 [ label = "Normal" ]
|
1 -> 6 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 5 [ label = "Normal" ]
|
1 -> 5 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 5 [ label = "Normal" ]
|
1 -> 5 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 5 [ label = "Normal" ]
|
1 -> 5 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 5 [ label = "Normal" ]
|
1 -> 5 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -21,13 +21,13 @@ digraph {
|
||||||
4 -> 0 [ label = "Error(Implicit)" ]
|
4 -> 0 [ label = "Error(Implicit)" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
4 -> 5 [ label = "Jump" ]
|
4 -> 5 [ label = "Jump" ]
|
||||||
6 -> 0 [ label = "Error(Implicit)" ]
|
6 -> 0 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
5 -> 6 [ label = "Unreachable" , style = "dotted" ]
|
5 -> 6 [ label = "Unreachable" , style = "dotted" ]
|
||||||
7 -> 0 [ label = "Error(Implicit)" ]
|
7 -> 0 [ label = "Error(Implicit)" ]
|
||||||
8 -> 0 [ label = "Error(Implicit)" ]
|
8 -> 0 [ label = "Error(Implicit)" ]
|
||||||
7 -> 8 [ label = "Jump" ]
|
7 -> 8 [ label = "Jump" ]
|
||||||
4 -> 7 [ label = "Normal" ]
|
4 -> 7 [ label = "Normal" ]
|
||||||
6 -> 7 [ label = "Normal" ]
|
6 -> 7 [ label = "Normal" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Normal" ]
|
3 -> 4 [ label = "Normal" ]
|
||||||
3 -> 7 [ label = "Normal" ]
|
3 -> 7 [ label = "Normal" ]
|
||||||
9 -> 0 [ label = "Error(Implicit)" ]
|
9 -> 0 [ label = "Error(Implicit)" ]
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ digraph {
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" ]
|
||||||
5 -> 2 [ label = "Error(Implicit)" ]
|
5 -> 2 [ label = "Error(Implicit)" ]
|
||||||
4 -> 5 [ label = "Jump" ]
|
4 -> 5 [ label = "Jump" ]
|
||||||
6 -> 2 [ label = "Error(Implicit)" ]
|
6 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
5 -> 6 [ label = "Unreachable" , style = "dotted" ]
|
5 -> 6 [ label = "Unreachable" , style = "dotted" ]
|
||||||
7 -> 2 [ label = "Error(Implicit)" ]
|
7 -> 2 [ label = "Error(Implicit)" ]
|
||||||
8 -> 2 [ label = "Error(Implicit)" ]
|
8 -> 2 [ label = "Error(Implicit)" ]
|
||||||
|
|
@ -41,12 +41,12 @@ digraph {
|
||||||
9 -> 2 [ label = "Error(Implicit)" ]
|
9 -> 2 [ label = "Error(Implicit)" ]
|
||||||
10 -> 2 [ label = "Error(Implicit)" ]
|
10 -> 2 [ label = "Error(Implicit)" ]
|
||||||
9 -> 10 [ label = "Jump" ]
|
9 -> 10 [ label = "Jump" ]
|
||||||
11 -> 2 [ label = "Error(Implicit)" ]
|
11 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
10 -> 11 [ label = "Unreachable" , style = "dotted" ]
|
10 -> 11 [ label = "Unreachable" , style = "dotted" ]
|
||||||
12 -> 2 [ label = "Error(Implicit)" ]
|
12 -> 2 [ label = "Error(Implicit)" ]
|
||||||
13 -> 2 [ label = "Error(Implicit)" ]
|
13 -> 2 [ label = "Error(Implicit)" ]
|
||||||
12 -> 13 [ label = "Jump" ]
|
12 -> 13 [ label = "Jump" ]
|
||||||
14 -> 2 [ label = "Error(Implicit)" ]
|
14 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
13 -> 14 [ label = "Unreachable" , style = "dotted" ]
|
13 -> 14 [ label = "Unreachable" , style = "dotted" ]
|
||||||
15 -> 2 [ label = "Error(Implicit)" ]
|
15 -> 2 [ label = "Error(Implicit)" ]
|
||||||
16 -> 2 [ label = "Error(Implicit)" ]
|
16 -> 2 [ label = "Error(Implicit)" ]
|
||||||
|
|
@ -54,14 +54,14 @@ digraph {
|
||||||
17 -> 2 [ label = "Error(Implicit)" ]
|
17 -> 2 [ label = "Error(Implicit)" ]
|
||||||
18 -> 2 [ label = "Error(Implicit)" ]
|
18 -> 2 [ label = "Error(Implicit)" ]
|
||||||
17 -> 18 [ label = "Jump" ]
|
17 -> 18 [ label = "Jump" ]
|
||||||
19 -> 2 [ label = "Error(Implicit)" ]
|
19 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
18 -> 19 [ label = "Unreachable" , style = "dotted" ]
|
18 -> 19 [ label = "Unreachable" , style = "dotted" ]
|
||||||
4 -> 7 [ label = "Normal" ]
|
4 -> 7 [ label = "Normal" ]
|
||||||
4 -> 9 [ label = "Normal" ]
|
4 -> 9 [ label = "Normal" ]
|
||||||
4 -> 12 [ label = "Normal" ]
|
4 -> 12 [ label = "Normal" ]
|
||||||
4 -> 15 [ label = "Normal" ]
|
4 -> 15 [ label = "Normal" ]
|
||||||
4 -> 17 [ label = "Normal" ]
|
4 -> 17 [ label = "Normal" ]
|
||||||
6 -> 7 [ label = "Normal" ]
|
6 -> 7 [ label = "Normal" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Normal" ]
|
3 -> 4 [ label = "Normal" ]
|
||||||
7 -> 9 [ label = "Normal" ]
|
7 -> 9 [ label = "Normal" ]
|
||||||
7 -> 12 [ label = "Normal" ]
|
7 -> 12 [ label = "Normal" ]
|
||||||
|
|
@ -72,21 +72,21 @@ digraph {
|
||||||
9 -> 12 [ label = "Normal" ]
|
9 -> 12 [ label = "Normal" ]
|
||||||
9 -> 15 [ label = "Normal" ]
|
9 -> 15 [ label = "Normal" ]
|
||||||
9 -> 17 [ label = "Normal" ]
|
9 -> 17 [ label = "Normal" ]
|
||||||
11 -> 12 [ label = "Normal" ]
|
11 -> 12 [ label = "Normal" , style = "dotted" ]
|
||||||
3 -> 9 [ label = "Normal" ]
|
3 -> 9 [ label = "Normal" ]
|
||||||
12 -> 15 [ label = "Normal" ]
|
12 -> 15 [ label = "Normal" ]
|
||||||
12 -> 17 [ label = "Normal" ]
|
12 -> 17 [ label = "Normal" ]
|
||||||
14 -> 15 [ label = "Normal" ]
|
14 -> 15 [ label = "Normal" , style = "dotted" ]
|
||||||
3 -> 12 [ label = "Normal" ]
|
3 -> 12 [ label = "Normal" ]
|
||||||
15 -> 17 [ label = "Normal" ]
|
15 -> 17 [ label = "Normal" ]
|
||||||
16 -> 17 [ label = "Normal" ]
|
16 -> 17 [ label = "Normal" ]
|
||||||
3 -> 15 [ label = "Normal" ]
|
3 -> 15 [ label = "Normal" ]
|
||||||
3 -> 17 [ label = "Normal" ]
|
3 -> 17 [ label = "Normal" ]
|
||||||
20 -> 2 [ label = "Error(Implicit)" ]
|
20 -> 2 [ label = "Error(Implicit)" ]
|
||||||
19 -> 20 [ label = "Normal" ]
|
19 -> 20 [ label = "Normal" , style = "dotted" ]
|
||||||
5 -> 20 [ label = "Jump" ]
|
5 -> 20 [ label = "Jump" ]
|
||||||
10 -> 20 [ label = "Jump" ]
|
10 -> 20 [ label = "Jump" ]
|
||||||
21 -> 2 [ label = "Error(Implicit)" ]
|
21 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
20 -> 21 [ label = "Unreachable" , style = "dotted" ]
|
20 -> 21 [ label = "Unreachable" , style = "dotted" ]
|
||||||
22 -> 0 [ label = "Error(Implicit)" ]
|
22 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 22 [ label = "Normal" ]
|
1 -> 22 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,13 @@ digraph {
|
||||||
1 -> 0 [ label = "Error(Implicit)" ]
|
1 -> 0 [ label = "Error(Implicit)" ]
|
||||||
3 -> 2 [ label = "Error(Implicit)" ]
|
3 -> 2 [ label = "Error(Implicit)" ]
|
||||||
1 -> 3 [ label = "NewFunction" ]
|
1 -> 3 [ label = "NewFunction" ]
|
||||||
4 -> 2 [ label = "Error(Implicit)" ]
|
4 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
3 -> 4 [ label = "Unreachable" , style = "dotted" ]
|
||||||
5 -> 0 [ label = "Error(Implicit)" ]
|
5 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 5 [ label = "Normal" ]
|
1 -> 5 [ label = "Normal" ]
|
||||||
7 -> 6 [ label = "Error(Implicit)" ]
|
7 -> 6 [ label = "Error(Implicit)" ]
|
||||||
5 -> 7 [ label = "NewFunction" ]
|
5 -> 7 [ label = "NewFunction" ]
|
||||||
8 -> 6 [ label = "Error(Implicit)" ]
|
8 -> 6 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
||||||
9 -> 0 [ label = "Error(Implicit)" ]
|
9 -> 0 [ label = "Error(Implicit)" ]
|
||||||
5 -> 9 [ label = "Normal" ]
|
5 -> 9 [ label = "Normal" ]
|
||||||
|
|
|
||||||
|
|
@ -26,14 +26,14 @@ digraph {
|
||||||
4 -> 6 [ label = "Normal" ]
|
4 -> 6 [ label = "Normal" ]
|
||||||
5 -> 6 [ label = "Normal" ]
|
5 -> 6 [ label = "Normal" ]
|
||||||
7 -> 2 [ label = "Error(Implicit)" ]
|
7 -> 2 [ label = "Error(Implicit)" ]
|
||||||
8 -> 2 [ label = "Error(Implicit)" ]
|
8 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
7 -> 8 [ label = "Unreachable" , style = "dotted" ]
|
||||||
9 -> 2 [ label = "Error(Implicit)" ]
|
9 -> 2 [ label = "Error(Implicit)" ]
|
||||||
3 -> 4 [ label = "Normal" ]
|
3 -> 4 [ label = "Normal" ]
|
||||||
4 -> 7 [ label = "Jump" ]
|
4 -> 7 [ label = "Jump" ]
|
||||||
8 -> 4 [ label = "Backedge" ]
|
8 -> 4 [ label = "Backedge" , style = "dotted" ]
|
||||||
4 -> 9 [ label = "Normal" ]
|
4 -> 9 [ label = "Normal" ]
|
||||||
10 -> 2 [ label = "Error(Implicit)" ]
|
10 -> 2 [ label = "Error(Implicit)" , style = "dotted" ]
|
||||||
9 -> 10 [ label = "Unreachable" , style = "dotted" ]
|
9 -> 10 [ label = "Unreachable" , style = "dotted" ]
|
||||||
11 -> 0 [ label = "Error(Implicit)" ]
|
11 -> 0 [ label = "Error(Implicit)" ]
|
||||||
1 -> 11 [ label = "Normal" ]
|
1 -> 11 [ label = "Normal" ]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue