1 cananian 1.1.2.1 // AnalysisCheckOracle.java, created Tue Jan 16 12:12:16 2001 by cananian
  2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 cananian 1.1.2.1 package harpoon.Analysis.Transactions;
  5 cananian 1.1.2.1 
  6 cananian 1.1.2.2 import harpoon.ClassFile.HCodeElement;
  7 cananian 1.1.2.4 import harpoon.Temp.Temp;
  8 cananian 1.4     import net.cscott.jutil.AggregateSetFactory;
  9 cananian 1.4     import net.cscott.jutil.SetFactory;
 10 cananian 1.1.2.3 
 11 cananian 1.1.2.4 import java.util.Collection;
 12 cananian 1.1.2.4 import java.util.HashMap;
 13 cananian 1.1.2.4 import java.util.Iterator;
 14 cananian 1.1.2.4 import java.util.Map;
 15 cananian 1.1.2.4 import java.util.Set;
 16 cananian 1.1.2.1 
 17 cananian 1.1.2.1 /**
 18 cananian 1.1.2.1  * An <code>AnalysisCheckOracle</code> is used when one wants to
 19 cananian 1.1.2.1  * do some analysis and store the results of the check oracle.
 20 cananian 1.1.2.1  * 
 21 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 22 cananian 1.4      * @version $Id: AnalysisCheckOracle.java,v 1.4 2004/02/08 01:54:21 cananian Exp $
 23 cananian 1.1.2.1  */
 24 cananian 1.1.2.1 abstract class AnalysisCheckOracle extends CheckOracle {
 25 cananian 1.2.2.1     final Map<HCodeElement,CheckSet> results =
 26 cananian 1.2.2.1         new HashMap<HCodeElement,CheckSet>();
 27 cananian 1.2.2.1     public Set<Temp> createReadVersions(HCodeElement hce) {
 28 cananian 1.2.2.1         return results.get(hce).readVersions;
 29 cananian 1.1.2.1     }
 30 cananian 1.2.2.1     public Set<Temp> createWriteVersions(HCodeElement hce) {
 31 cananian 1.2.2.1         return results.get(hce).writeVersions;
 32 cananian 1.1.2.1     }
 33 cananian 1.2.2.1     public Set<RefAndField> checkFieldReads(HCodeElement hce) {
 34 cananian 1.2.2.1         return results.get(hce).fieldReads;
 35 cananian 1.1.2.1     }
 36 cananian 1.2.2.1     public Set<RefAndField> checkFieldWrites(HCodeElement hce) {
 37 cananian 1.2.2.1         return results.get(hce).fieldWrites;
 38 cananian 1.1.2.6     }
 39 cananian 1.2.2.1     public Set<RefAndIndexAndType> checkArrayElementReads(HCodeElement hce) {
 40 cananian 1.2.2.1         return results.get(hce).elementReads;
 41 cananian 1.1.2.6     }
 42 cananian 1.2.2.1     public Set<RefAndIndexAndType> checkArrayElementWrites(HCodeElement hce) {
 43 cananian 1.2.2.1         return results.get(hce).elementWrites;
 44 cananian 1.1.2.1     }
 45 cananian 1.1.2.1     
 46 cananian 1.1.2.1     /** Creates a <code>AnalysisCheckOracle</code>. */
 47 cananian 1.1.2.3     AnalysisCheckOracle() { /* nothing */ }
 48 cananian 1.1.2.1 
 49 cananian 1.1.2.3     private final SetFactory sf = new AggregateSetFactory();
 50 cananian 1.1.2.1 
 51 cananian 1.1.2.3     class CheckSet {
 52 cananian 1.2.2.1         final Set<Temp> readVersions = sf.makeSet();
 53 cananian 1.2.2.1         final Set<Temp> writeVersions = sf.makeSet();
 54 cananian 1.2.2.1         final Set<RefAndField> fieldReads = sf.makeSet();
 55 cananian 1.2.2.1         final Set<RefAndField> fieldWrites = sf.makeSet();
 56 cananian 1.2.2.1         final Set<RefAndIndexAndType> elementReads = sf.makeSet();
 57 cananian 1.2.2.1         final Set<RefAndIndexAndType> elementWrites = sf.makeSet();
 58 cananian 1.1.2.1         
 59 cananian 1.1.2.1         CheckSet() { /* new empty set */ }
 60 cananian 1.1.2.3         CheckSet(CheckSet cs) { // new set w/ contents of given set.
 61 cananian 1.1.2.3             this.readVersions.addAll(cs.readVersions);
 62 cananian 1.1.2.3             this.writeVersions.addAll(cs.writeVersions);
 63 cananian 1.1.2.6             this.fieldReads.addAll(cs.fieldReads);
 64 cananian 1.1.2.6             this.fieldWrites.addAll(cs.fieldWrites);
 65 cananian 1.1.2.6             this.elementReads.addAll(cs.elementReads);
 66 cananian 1.1.2.6             this.elementWrites.addAll(cs.elementWrites);
 67 cananian 1.1.2.3         }
 68 cananian 1.1.2.1         CheckSet(CheckOracle co, HCodeElement hce) {
 69 cananian 1.1.2.1             this.readVersions.addAll(co.createReadVersions(hce));
 70 cananian 1.1.2.1             this.writeVersions.addAll(co.createWriteVersions(hce));
 71 cananian 1.1.2.6             this.fieldReads.addAll(co.checkFieldReads(hce));
 72 cananian 1.1.2.6             this.fieldWrites.addAll(co.checkFieldWrites(hce));
 73 cananian 1.1.2.6             this.elementReads.addAll(co.checkArrayElementReads(hce));
 74 cananian 1.1.2.6             this.elementWrites.addAll(co.checkArrayElementWrites(hce));
 75 cananian 1.1.2.1         }
 76 cananian 1.1.2.1         void addAll(CheckSet cs) {
 77 cananian 1.1.2.1             this.readVersions.addAll(cs.readVersions);
 78 cananian 1.1.2.1             this.writeVersions.addAll(cs.writeVersions);
 79 cananian 1.1.2.6             this.fieldReads.addAll(cs.fieldReads);
 80 cananian 1.1.2.6             this.fieldWrites.addAll(cs.fieldWrites);
 81 cananian 1.1.2.6             this.elementReads.addAll(cs.elementReads);
 82 cananian 1.1.2.6             this.elementWrites.addAll(cs.elementWrites);
 83 cananian 1.1.2.4         }
 84 cananian 1.1.2.4         /** Remove all checks which mention <code>Temp</code>s contained
 85 cananian 1.1.2.4          *  in the given <code>Collection</code>. */
 86 cananian 1.2.2.1         void removeAll(Collection<Temp> temps) {
 87 cananian 1.2.2.1             for (Iterator<Temp> it=readVersions.iterator(); it.hasNext(); )
 88 cananian 1.2.2.1                 if (temps.contains(it.next()))
 89 cananian 1.1.2.4                     it.remove();
 90 cananian 1.2.2.1             for (Iterator<Temp> it=writeVersions.iterator(); it.hasNext(); )
 91 cananian 1.2.2.1                 if (temps.contains(it.next()))
 92 cananian 1.1.2.4                     it.remove();
 93 cananian 1.2.2.1             for (Iterator<RefAndField> it=fieldReads.iterator();it.hasNext();)
 94 cananian 1.2.2.1                 if (temps.contains(it.next().objref))
 95 cananian 1.1.2.6                     it.remove();
 96 cananian 1.2.2.1             for (Iterator<RefAndField> it=fieldWrites.iterator();it.hasNext();)
 97 cananian 1.2.2.1                 if (temps.contains(it.next().objref))
 98 cananian 1.1.2.4                     it.remove();
 99 cananian 1.2.2.1             for (Iterator<RefAndIndexAndType> it=elementReads.iterator();
100 cananian 1.2.2.1                  it.hasNext(); ) {
101 cananian 1.2.2.1                 RefAndIndexAndType rit = it.next();
102 cananian 1.1.2.6                 if (temps.contains(rit.objref) || temps.contains(rit.index))
103 cananian 1.1.2.6                     it.remove();
104 cananian 1.1.2.6             }
105 cananian 1.2.2.1             for (Iterator<RefAndIndexAndType> it=elementWrites.iterator();
106 cananian 1.2.2.1                  it.hasNext(); ) {
107 cananian 1.2.2.1                 RefAndIndexAndType rit = it.next();
108 cananian 1.1.2.4                 if (temps.contains(rit.objref) || temps.contains(rit.index))
109 cananian 1.1.2.4                     it.remove();
110 cananian 1.1.2.4             }
111 cananian 1.1.2.1         }
112 cananian 1.1.2.5         void retainAll(CheckSet cs) {
113 cananian 1.1.2.5             this.readVersions.retainAll(cs.readVersions);
114 cananian 1.1.2.5             this.writeVersions.retainAll(cs.writeVersions);
115 cananian 1.1.2.6             this.fieldReads.retainAll(cs.fieldReads);
116 cananian 1.1.2.6             this.fieldWrites.retainAll(cs.fieldWrites);
117 cananian 1.1.2.6             this.elementReads.retainAll(cs.elementReads);
118 cananian 1.1.2.6             this.elementWrites.retainAll(cs.elementWrites);
119 cananian 1.1.2.5         }
120 cananian 1.1.2.1         void removeAll(CheckSet cs) {
121 cananian 1.1.2.1             this.readVersions.removeAll(cs.readVersions);
122 cananian 1.1.2.1             this.writeVersions.removeAll(cs.writeVersions);
123 cananian 1.1.2.6             this.fieldReads.removeAll(cs.fieldReads);
124 cananian 1.1.2.6             this.fieldWrites.removeAll(cs.fieldWrites);
125 cananian 1.1.2.6             this.elementReads.removeAll(cs.elementReads);
126 cananian 1.1.2.6             this.elementWrites.removeAll(cs.elementWrites);
127 cananian 1.1.2.5         }
128 cananian 1.1.2.5         boolean isEmpty() {
129 cananian 1.1.2.5             return readVersions.isEmpty() && writeVersions.isEmpty()
130 cananian 1.1.2.6                 && fieldReads.isEmpty() && fieldWrites.isEmpty()
131 cananian 1.1.2.6                 && elementReads.isEmpty() && elementWrites.isEmpty();
132 cananian 1.1.2.2         }
133 cananian 1.1.2.2         void clear() {
134 cananian 1.1.2.2             this.readVersions.clear();
135 cananian 1.1.2.2             this.writeVersions.clear();
136 cananian 1.1.2.6             this.fieldReads.clear();
137 cananian 1.1.2.6             this.fieldWrites.clear();
138 cananian 1.1.2.6             this.elementReads.clear();
139 cananian 1.1.2.6             this.elementWrites.clear();
140 cananian 1.1.2.2         }
141 cananian 1.2.2.2         public CheckSet clone() { return new CheckSet(this); }
142 cananian 1.1.2.2         public String toString() {
143 cananian 1.1.2.2             return "Rd: "+readVersions+" / Wr: "+writeVersions+" / "+
144 cananian 1.1.2.6                 "FldR: "+fieldReads+" / FldW: "+fieldWrites+" / "+
145 cananian 1.1.2.6                 "EleR: "+elementReads+" / EleW: "+elementWrites;
146 cananian 1.1.2.1         }
147 cananian 1.1.2.1     }
148 cananian 1.2     }