1 cananian 1.1.2.1 // SimpleCheckOracle.java, created Sun Nov 12 01:25:37 2000 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.1 import harpoon.ClassFile.HCodeElement;
 7 cananian 1.1.2.1 import harpoon.IR.Quads.AGET;
 8 cananian 1.1.2.2 import harpoon.IR.Quads.ARRAYINIT;
 9 cananian 1.1.2.1 import harpoon.IR.Quads.ASET;
10 cananian 1.1.2.1 import harpoon.IR.Quads.GET;
11 cananian 1.1.2.1 import harpoon.IR.Quads.SET;
12 cananian 1.2.2.1 import harpoon.Temp.Temp;
13 cananian 1.1.2.1 
14 cananian 1.1.2.1 import java.util.Collections;
15 cananian 1.1.2.1 import java.util.Set;
16 cananian 1.1.2.1 /**
17 cananian 1.1.2.1  * A <code>SimpleCheckOracle</code> provides a valid but extremely
18 cananian 1.1.2.1  * simple-minded implementation of <code>CheckOracle</code>.
19 cananian 1.1.2.1  * 
20 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
21 cananian 1.3      * @version $Id: SimpleCheckOracle.java,v 1.3 2002/04/10 03:01:43 cananian Exp $
22 cananian 1.1.2.1  */
23 cananian 1.1.2.1 class SimpleCheckOracle extends CheckOracle {
24 cananian 1.1.2.3     private final boolean noArrayModification;
25 cananian 1.1.2.3     SimpleCheckOracle() { this(false); }
26 cananian 1.1.2.3     SimpleCheckOracle(boolean noArrayModification) {
27 cananian 1.1.2.3         this.noArrayModification = noArrayModification;
28 cananian 1.1.2.3     }
29 cananian 1.2.2.1     public Set<Temp> createReadVersions(HCodeElement hce) {
30 cananian 1.1.2.3         if (hce instanceof AGET && !noArrayModification)
31 cananian 1.1.2.1             return Collections.singleton(((AGET)hce).objectref());
32 cananian 1.1.2.1         if (hce instanceof GET && !((GET)hce).isStatic())
33 cananian 1.1.2.1             return Collections.singleton(((GET)hce).objectref());
34 cananian 1.1.2.1         return Collections.EMPTY_SET;
35 cananian 1.1.2.1     }
36 cananian 1.2.2.1     public Set<Temp> createWriteVersions(HCodeElement hce) {
37 cananian 1.1.2.3         if (hce instanceof ARRAYINIT && !noArrayModification)
38 cananian 1.1.2.2             return Collections.singleton(((ARRAYINIT)hce).objectref());
39 cananian 1.1.2.3         if (hce instanceof ASET && !noArrayModification)
40 cananian 1.1.2.1             return Collections.singleton(((ASET)hce).objectref());
41 cananian 1.1.2.1         if (hce instanceof SET && !((SET)hce).isStatic())
42 cananian 1.1.2.1             return Collections.singleton(((SET)hce).objectref());
43 cananian 1.1.2.1         return Collections.EMPTY_SET;
44 cananian 1.1.2.1     }
45 cananian 1.2.2.1     public Set<RefAndField> checkFieldReads(HCodeElement hce) {
46 cananian 1.1.2.1         if (hce instanceof GET && !((GET)hce).isStatic())
47 cananian 1.1.2.1             return Collections.singleton
48 cananian 1.1.2.1                 (new RefAndField(((GET)hce).objectref(),((GET)hce).field()));
49 cananian 1.1.2.4         return Collections.EMPTY_SET;
50 cananian 1.1.2.4     }
51 cananian 1.2.2.1     public Set<RefAndField> checkFieldWrites(HCodeElement hce) {
52 cananian 1.1.2.1         if (hce instanceof SET && !((SET)hce).isStatic())
53 cananian 1.1.2.1             return Collections.singleton
54 cananian 1.1.2.1                 (new RefAndField(((SET)hce).objectref(),((SET)hce).field()));
55 cananian 1.1.2.1         return Collections.EMPTY_SET;
56 cananian 1.1.2.1     }
57 cananian 1.2.2.1     public Set<RefAndIndexAndType> checkArrayElementReads(HCodeElement hce) {
58 cananian 1.1.2.3         if (hce instanceof AGET && !noArrayModification) {
59 cananian 1.1.2.1             AGET q = (AGET) hce;
60 cananian 1.1.2.1             return Collections.singleton
61 cananian 1.1.2.1                 (new RefAndIndexAndType(q.objectref(), q.index(), q.type()));
62 cananian 1.1.2.1         }
63 cananian 1.1.2.4         return Collections.EMPTY_SET;
64 cananian 1.1.2.4     }
65 cananian 1.2.2.1     public Set<RefAndIndexAndType> checkArrayElementWrites(HCodeElement hce) {
66 cananian 1.1.2.3         if (hce instanceof ASET && !noArrayModification) {
67 cananian 1.1.2.1             ASET q = (ASET) hce;
68 cananian 1.1.2.1             return Collections.singleton
69 cananian 1.1.2.1                 (new RefAndIndexAndType(q.objectref(), q.index(), q.type()));
70 cananian 1.1.2.1         }
71 cananian 1.1.2.1         return Collections.EMPTY_SET;
72 cananian 1.1.2.1     }
73 cananian 1.1.2.1 }
74 cananian 1.2