aadea0e26f
Interpretation: a graph A is a subgraph of B if information available at nodes of A depends on the paths taken in B. For example, local classes are subgraphs of a graph in which they are declared, and members of those classes are subgraphs of the local class itself - because these members can reference captured values. Consequences: * if graph G is a subgraph of node N, then G is a subgraph of N's owner; * `ControlFlowAnalysisDiagnosticComponent` will only visit root graphs; * `graph.traverse` will ignore subgraph boundaries, as if all subgraphs are inlined into one huge root graph; * if a control flow checker needs information from a declaration to which a graph is attached, it must look at subgraphs explicitly. For example, consider the `callsInPlace` checker. When a function has a `callsInPlace` contract and a local declaration, the checker must visit that local declaration to ensure it does not capture the allegedly called-in-place argument - hence `graph.traverse` will look at the nodes. However, the local declaration can also be a function with its own `callsInPlace` contracts, so the checker should also run for it in isolation. If that sounds quadratic, that's because unfortunately it is.
93 lines
3.2 KiB
Plaintext
Vendored
93 lines
3.2 KiB
Plaintext
Vendored
digraph initBlock_kt {
|
|
graph [nodesep=3]
|
|
node [shape=box penwidth=2]
|
|
edge [penwidth=2]
|
|
|
|
subgraph cluster_0 {
|
|
color=red
|
|
0 [label="Enter function <init>" style="filled" fillcolor=red];
|
|
1 [label="Delegated constructor call: super<R|kotlin/Any|>()" style="filled" fillcolor=yellow];
|
|
2 [label="Exit function <init>" style="filled" fillcolor=red];
|
|
}
|
|
0 -> {1};
|
|
1 -> {2};
|
|
|
|
subgraph cluster_1 {
|
|
color=red
|
|
9 [label="Enter class Foo" style="filled" fillcolor=red];
|
|
10 [label="Part of class initialization"];
|
|
subgraph cluster_2 {
|
|
color=blue
|
|
3 [label="Enter init block" style="filled" fillcolor=red];
|
|
subgraph cluster_3 {
|
|
color=blue
|
|
4 [label="Enter block"];
|
|
5 [label="Const: Int(1)"];
|
|
6 [label="Variable declaration: lval x: R|kotlin/Int|"];
|
|
7 [label="Exit block"];
|
|
}
|
|
8 [label="Exit init block" style="filled" fillcolor=red];
|
|
}
|
|
11 [label="Exit class Foo" style="filled" fillcolor=red];
|
|
}
|
|
9 -> {10} [color=green];
|
|
10 -> {3} [color=green];
|
|
10 -> {11} [style=dotted];
|
|
10 -> {3} [style=dashed];
|
|
3 -> {4};
|
|
4 -> {5};
|
|
5 -> {6};
|
|
6 -> {7};
|
|
7 -> {8};
|
|
8 -> {11} [color=green];
|
|
|
|
subgraph cluster_4 {
|
|
color=red
|
|
12 [label="Enter function <init>" style="filled" fillcolor=red];
|
|
13 [label="Delegated constructor call: super<R|kotlin/Any|>()" style="filled" fillcolor=yellow];
|
|
14 [label="Exit function <init>" style="filled" fillcolor=red];
|
|
}
|
|
12 -> {13};
|
|
13 -> {14};
|
|
|
|
subgraph cluster_5 {
|
|
color=red
|
|
26 [label="Enter class Bar" style="filled" fillcolor=red];
|
|
27 [label="Part of class initialization"];
|
|
subgraph cluster_6 {
|
|
color=blue
|
|
15 [label="Enter init block" style="filled" fillcolor=red];
|
|
subgraph cluster_7 {
|
|
color=blue
|
|
16 [label="Enter block"];
|
|
17 [label="Const: Int(1)"];
|
|
18 [label="Variable declaration: lval x: R|kotlin/Int|"];
|
|
19 [label="Function call: R|java/lang/Exception.Exception|()" style="filled" fillcolor=yellow];
|
|
20 [label="Throw: throw R|java/lang/Exception.Exception|()"];
|
|
21 [label="Stub" style="filled" fillcolor=gray];
|
|
22 [label="Const: Int(2)" style="filled" fillcolor=gray];
|
|
23 [label="Variable declaration: lval y: R|kotlin/Int|" style="filled" fillcolor=gray];
|
|
24 [label="Exit block" style="filled" fillcolor=gray];
|
|
}
|
|
25 [label="Exit init block" style="filled" fillcolor=red style="filled" fillcolor=gray];
|
|
}
|
|
28 [label="Exit class Bar" style="filled" fillcolor=red style="filled" fillcolor=gray];
|
|
}
|
|
26 -> {27} [color=green];
|
|
27 -> {15} [color=green];
|
|
27 -> {28} [style=dotted];
|
|
27 -> {15} [style=dashed];
|
|
15 -> {16};
|
|
16 -> {17};
|
|
17 -> {18};
|
|
18 -> {19};
|
|
19 -> {20};
|
|
20 -> {21} [style=dotted];
|
|
21 -> {22} [style=dotted];
|
|
22 -> {23} [style=dotted];
|
|
23 -> {24} [style=dotted];
|
|
24 -> {25} [style=dotted];
|
|
25 -> {28} [style=dotted];
|
|
|
|
}
|