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