KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > soot > dava > internal > SET > SETControlFlowNode


1 /* Soot - a J*va Optimization Framework
2  * Copyright (C) 2003 Jerome Miecznikowski
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */

19
20 package soot.dava.internal.SET;
21
22 import java.util.*;
23 import soot.util.*;
24 import soot.jimple.*;
25 import soot.dava.internal.asg.*;
26
27 public abstract class SETControlFlowNode extends SETNode
28 {
29     private AugmentedStmt characterizingStmt;
30
31     public SETControlFlowNode( AugmentedStmt characterizingStmt, IterableSet body)
32     {
33     super( body);
34     this.characterizingStmt = characterizingStmt;
35     }
36
37     public AugmentedStmt get_CharacterizingStmt()
38     {
39     return characterizingStmt;
40     }
41
42     protected boolean resolve( SETNode parent)
43     {
44     Iterator sbit = parent.get_SubBodies().iterator();
45     while (sbit.hasNext()) {
46         IterableSet subBody = (IterableSet) sbit.next();
47         
48         if (subBody.contains( get_EntryStmt()) == false)
49         continue;
50
51         IterableSet childChain = (IterableSet) parent.get_Body2ChildChain().get( subBody);
52         HashSet childUnion = new HashSet();
53
54         Iterator ccit = childChain.iterator();
55         while (ccit.hasNext()) {
56         
57         SETNode child = (SETNode) ccit.next();
58         IterableSet childBody = child.get_Body();
59         childUnion.addAll( childBody);
60
61         if (childBody.contains( characterizingStmt)) {
62             
63             Iterator bit = get_Body().snapshotIterator();
64             while (bit.hasNext()) {
65             AugmentedStmt as = (AugmentedStmt) bit.next();
66
67             if (childBody.contains( as) == false)
68                 remove_AugmentedStmt( as);
69
70             else if ((child instanceof SETControlFlowNode) && ((child instanceof SETUnconditionalWhileNode) == false)) {
71                 SETControlFlowNode scfn = (SETControlFlowNode) child;
72
73                 if ((scfn.get_CharacterizingStmt() == as) ||
74                 ((as.cpreds.size() == 1) && (as.get_Stmt() instanceof GotoStmt) && (scfn.get_CharacterizingStmt() == as.cpreds.get(0))))
75
76                 remove_AugmentedStmt( as);
77             }
78             }
79
80             return true;
81         }
82         }
83     }
84
85     return true;
86     }
87 }
88
Popular Tags