Commit 8d83f26 Michael Emmi
committed
1 parent e4365f6 commit 8d83f26 Copy full SHA for 8d83f26
File tree 2 files changed +47
-10
lines changed
main/java/soot/jimple/spark/solver
test/java/soot/jimple/spark/solver
2 files changed +47
-10
lines changed Original file line number Diff line number Diff line change 22
22
* #L%
23
23
*/
24
24
25
- import java .util .ArrayList ;
26
25
import java .util .HashSet ;
27
- import java .util .List ;
26
+ import java .util .Stack ;
28
27
29
28
import soot .jimple .spark .pag .Node ;
30
29
import soot .jimple .spark .pag .PAG ;
31
30
import soot .jimple .spark .pag .VarNode ;
32
31
33
32
/**
34
33
* Performs a pseudo-topological sort on the VarNodes in a PAG.
35
- *
34
+ *
36
35
* @author Ondrej Lhotak
37
36
*/
38
37
@@ -64,23 +63,21 @@ protected void dfsVisit(VarNode n) {
64
63
if (visited .contains (n )) {
65
64
return ;
66
65
}
67
- List <VarNode > stack = new ArrayList <>();
68
- List <VarNode > all = new ArrayList <>();
66
+ Stack <VarNode > stack = new Stack <>();
69
67
stack .add (n );
70
68
while (!stack .isEmpty ()) {
71
- VarNode s = stack .remove ( stack . size () - 1 );
69
+ VarNode s = stack .peek ( );
72
70
if (visited .add (s )) {
73
- all .add (s );
74
71
Node [] succs = pag .simpleLookup (s );
75
72
for (Node element : succs ) {
76
73
if (ignoreTypes || pag .getTypeManager ().castNeverFails (n .getType (), element .getType ())) {
77
74
stack .add ((VarNode ) element );
78
75
}
79
76
}
77
+ } else {
78
+ stack .pop ();
79
+ s .setFinishingNumber (nextFinishNumber ++);
80
80
}
81
81
}
82
- for (int i = all .size () - 1 ; i >= 0 ; i --) {
83
- all .get (i ).setFinishingNumber (nextFinishNumber ++);
84
- }
85
82
}
86
83
}
Original file line number Diff line number Diff line change
1
+ package soot .jimple .spark .solver ;
2
+
3
+ import java .util .Collections ;
4
+
5
+ import org .junit .Test ;
6
+
7
+ import static org .junit .Assert .assertEquals ;
8
+
9
+ import soot .Scene ;
10
+ import soot .Type ;
11
+ import soot .jimple .spark .pag .PAG ;
12
+ import soot .jimple .spark .pag .VarNode ;
13
+ import soot .options .SparkOptions ;
14
+
15
+ public class SCCCollapserTest {
16
+
17
+ @ Test
18
+ public void testSeparateComponents () {
19
+ Scene .v ().loadBasicClasses ();
20
+ Type type = Scene .v ().getObjectType ();
21
+
22
+ SparkOptions sparkOptions = new SparkOptions (Collections .emptyMap ());
23
+ PAG pag = new PAG (sparkOptions );
24
+
25
+ VarNode a = pag .makeGlobalVarNode ("a" , type );
26
+ VarNode b = pag .makeGlobalVarNode ("b" , type );
27
+ VarNode c = pag .makeGlobalVarNode ("c" , type );
28
+ pag .addEdge (a , b );
29
+ pag .addEdge (a , c );
30
+ pag .addEdge (b , c );
31
+
32
+ SCCCollapser sccCollapser = new SCCCollapser (pag , false );
33
+ sccCollapser .collapse ();
34
+ pag .cleanUpMerges ();
35
+
36
+ assertEquals (a , a .getReplacement ());
37
+ assertEquals (b , b .getReplacement ());
38
+ assertEquals (c , c .getReplacement ());
39
+ }
40
+ }
You can’t perform that action at this time.
0 commit comments