1 vivien   1.1.2.1 // ODParIntGraphPair.java, created Mon Mar 27 20:11:14 2000 by salcianu
 2 cananian 1.1.2.2 // Copyright (C) 2000 Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu>
 3 vivien   1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 vivien   1.1.2.1 package harpoon.Analysis.PointerAnalysis;
 5 vivien   1.1.2.1 
 6 vivien   1.1.2.1 /**
 7 vivien   1.1.2.1  * <code>ODParIntGraphPair</code> is a simple pair of two
 8 vivien   1.1.2.1  <code>ODParIntGraph</code>s.
 9 vivien   1.1.2.1 
10 vivien   1.1.2.1  The existence of this structure is motivated by some details
11 vivien   1.1.2.1  of the FLEX intermediate representation.
12 vivien   1.1.2.1 
13 vivien   1.1.2.1  In the original algorithm, a single parallel interaction graph
14 vivien   1.1.2.1  at the end of each BB was enough. However, as in FLEX CALL is 
15 vivien   1.1.2.1  an implicit if, with a branch for normal execution and another
16 vivien   1.1.2.1  one for exceptions, there could be two ways of finishing a BB,
17 vivien   1.1.2.1  and hence, we need to maintain two graphs.
18 vivien   1.1.2.1 
19 vivien   1.1.2.1  * 
20 cananian 1.1.2.2  * @author  Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu>
21 cananian 1.2      * @version $Id: ODParIntGraphPair.java,v 1.2 2002/02/25 20:58:40 cananian Exp $
22 vivien   1.1.2.1  */
23 vivien   1.1.2.1 class ODParIntGraphPair {
24 vivien   1.1.2.1 
25 vivien   1.1.2.1     // Normally, pig0 is enough; if the BB is terminated with a CALL
26 vivien   1.1.2.1     //  pig0 is the graph for normal return from the call, and
27 vivien   1.1.2.1     //  pig1 is the graph in case an exception is returned
28 vivien   1.1.2.1     ODParIntGraph pig[] = new ODParIntGraph[2];
29 vivien   1.1.2.1 
30 vivien   1.1.2.1     /** Creates a <code>ODParIntGraphPair</code>. */
31 vivien   1.1.2.1     ODParIntGraphPair(ODParIntGraph _pig0, ODParIntGraph _pig1) {
32 vivien   1.1.2.1         this.pig[0] = _pig0;
33 vivien   1.1.2.1         this.pig[1] = _pig1;
34 vivien   1.1.2.1     }
35 vivien   1.1.2.1 
36 vivien   1.1.2.1     /** Checks whether two pairs are equal or not. */
37 vivien   1.1.2.1     static boolean identical(ODParIntGraphPair pp1, ODParIntGraphPair pp2){
38 vivien   1.1.2.1         if((pp1 == null) || (pp2 == null))
39 vivien   1.1.2.1             return pp1 == pp2;
40 vivien   1.1.2.1         return
41 vivien   1.1.2.1             ODParIntGraph.identical(pp1.pig[0], pp2.pig[0]) &&
42 vivien   1.1.2.1             ODParIntGraph.identical(pp1.pig[1], pp2.pig[1]);    
43 vivien   1.1.2.1     }
44 vivien   1.1.2.1 
45 vivien   1.1.2.1     /** Join another pair of <code>ODParIntGraph</code>s to this one.
46 vivien   1.1.2.1         The operation is done pairwise. This method is called only by
47 vivien   1.1.2.1         the <code>InterProcPA</code> module. */
48 vivien   1.1.2.1     void join(ODParIntGraphPair pp2){
49 vivien   1.1.2.1         if(pp2 == null) return;
50 vivien   1.1.2.1         partial_join(0, pp2.pig[0]);
51 vivien   1.1.2.1         partial_join(1, pp2.pig[1]);
52 vivien   1.1.2.1     }
53 vivien   1.1.2.1 
54 vivien   1.1.2.1     void join(ODParIntGraphPair pp2, boolean type){
55 vivien   1.1.2.1         if(pp2 == null) return;
56 vivien   1.1.2.1         partial_join(0, pp2.pig[0]);
57 vivien   1.1.2.1         if(type)
58 vivien   1.1.2.1             partial_join(1, pp2.pig[1]);
59 vivien   1.1.2.1     }
60 vivien   1.1.2.1 
61 vivien   1.1.2.1     private void partial_join(int k, ODParIntGraph pig2) {
62 vivien   1.1.2.1         if(pig2 == null)
63 vivien   1.1.2.1             return;
64 vivien   1.1.2.1 
65 vivien   1.1.2.1         if(pig[k] == null)
66 vivien   1.1.2.1             pig[k] = (ODParIntGraph) pig2.clone();
67 vivien   1.1.2.1 
68 vivien   1.1.2.1         pig[k].join(pig2);
69 vivien   1.1.2.1     }
70 vivien   1.1.2.1 
71 vivien   1.1.2.1 }
72 cananian 1.2