1 cananian 1.1.2.1 // HANDLER.java, created Tue Dec 15 17:06:51 1998 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1998 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.IR.Quads; 5 cananian 1.1.2.1 6 cananian 1.1.2.7 import harpoon.ClassFile.HClass; 7 cananian 1.1.2.7 import harpoon.ClassFile.HCodeElement; 8 cananian 1.1.2.1 import harpoon.Temp.Temp; 9 cananian 1.1.2.1 import harpoon.Temp.TempMap; 10 cananian 1.8 import net.cscott.jutil.UnmodifiableIterator; 11 cananian 1.8 import net.cscott.jutil.IteratorEnumerator; 12 cananian 1.1.2.1 import harpoon.Util.Util; 13 cananian 1.1.2.1 14 cananian 1.1.2.11 import java.util.AbstractSet; 15 cananian 1.1.2.1 import java.util.Enumeration; 16 cananian 1.1.2.11 import java.util.HashSet; 17 cananian 1.1.2.11 import java.util.Iterator; 18 cananian 1.1.2.11 import java.util.Set; 19 cananian 1.1.2.1 20 cananian 1.1.2.1 /** 21 cananian 1.1.2.1 * A <code>HANDLER</code> quad marks an entry to an exception handler. 22 cananian 1.1.2.1 * 23 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 24 cananian 1.8 * @version $Id: HANDLER.java,v 1.8 2004/02/08 01:55:25 cananian Exp $ 25 cananian 1.1.2.1 * @see METHOD 26 cananian 1.1.2.1 */ 27 cananian 1.1.2.1 public class HANDLER extends Quad { 28 cananian 1.1.2.2 /** The <code>Temp</code> holding the caught exception on invocation of 29 cananian 1.1.2.2 * this <code>HANDLER</code>. */ 30 cananian 1.1.2.2 protected Temp exceptionTemp; 31 cananian 1.1.2.3 /** The exception caught by this <code>HANDLER</code>, 32 cananian 1.1.2.3 * or <code>null</code> for any exception. */ 33 cananian 1.1.2.1 protected HClass caughtException; 34 cananian 1.1.2.1 /** The set of <code>Quad</code>s protected by this <code>HANDLER</code>.*/ 35 cananian 1.1.2.1 protected ProtectedSet protectedSet; 36 cananian 1.1.2.1 37 cananian 1.1.2.1 /** Creates a <code>HANDLER</code>. 38 cananian 1.1.2.2 * @param exceptionTemp 39 cananian 1.1.2.2 * the <code>Temp</code> holding the caught exception on 40 cananian 1.1.2.2 * invocation of this <code>HANDLER</code>. 41 cananian 1.1.2.1 * @param caughtException 42 cananian 1.1.2.3 * the exception type caught by this <code>HANDLER</code>, 43 cananian 1.1.2.3 * or <code>null</code> for any exception. 44 cananian 1.1.2.1 * @param protectedSet 45 cananian 1.1.2.1 * the set of <code>Quad</code>s protected by this 46 cananian 1.1.2.1 * <code>HANDLER</code>. 47 cananian 1.1.2.1 */ 48 cananian 1.1.2.2 public HANDLER(QuadFactory qf, HCodeElement source, Temp exceptionTemp, 49 cananian 1.1.2.1 HClass caughtException, ProtectedSet protectedSet) { 50 cananian 1.1.2.1 super(qf, source); 51 cananian 1.1.2.2 this.exceptionTemp = exceptionTemp; 52 cananian 1.1.2.1 this.caughtException = caughtException; 53 cananian 1.1.2.1 this.protectedSet = protectedSet; 54 cananian 1.3.2.1 assert exceptionTemp!=null && protectedSet!=null; 55 cananian 1.3.2.1 assert caughtException==null || 56 cananian 1.1.2.10 qf.getLinker().forName("java.lang.Throwable") 57 cananian 1.3.2.1 .isSuperclassOf(caughtException); 58 cananian 1.1.2.1 } 59 cananian 1.1.2.2 /** Returns the <code>Temp</code> which will hold the exception on 60 cananian 1.1.2.2 * the invocation of this <code>HANDLER</code>. */ 61 cananian 1.1.2.2 public Temp exceptionTemp() { return exceptionTemp; } 62 cananian 1.1.2.1 /** Returns the superclass of the exceptions caught by this 63 cananian 1.1.2.3 * <code>HANDLER</code>, or <code>null</code> if any exception 64 cananian 1.1.2.3 * is caught. */ 65 cananian 1.1.2.1 public HClass caughtException() { return caughtException; } 66 cananian 1.1.2.1 /** Returns <code>true</code> if the given exception <code>HClass</code> 67 cananian 1.1.2.1 * is caught by this <code>HANDLER</code>. */ 68 cananian 1.1.2.1 public boolean isCaught(HClass hc) { 69 cananian 1.1.2.3 if (caughtException==null) return true; // any exception is caught. 70 cananian 1.1.2.1 return caughtException.isSuperclassOf(hc); 71 cananian 1.1.2.1 } 72 cananian 1.1.2.1 /** Returns <code>true</code> if the given <code>Quad</code> is 73 cananian 1.1.2.1 * protected by this <code>HANDLER</code>; <code>false</code> otherwise.*/ 74 cananian 1.1.2.1 public boolean isProtected(Quad q) { 75 cananian 1.1.2.1 return protectedSet.isProtected(q); 76 cananian 1.1.2.1 } 77 cananian 1.1.2.1 /** Returns an <code>Enumeration</code> of the <code>Quad</code>s 78 cananian 1.7 * protected by this <code>HANDLER</code>. 79 cananian 1.7 * @deprecated */ 80 cananian 1.7 public Enumeration<Quad> protectedQuads() { 81 cananian 1.7 return new IteratorEnumerator<Quad>(protectedSet.iterator()); 82 cananian 1.1.2.11 } 83 cananian 1.1.2.11 /** Returns an immutable <code>Set</code> of the <code>Quads</code>s 84 cananian 1.1.2.11 * protected by this <code>HANDLER</code>. */ 85 cananian 1.7 public Set<Quad> protectedSet() { 86 cananian 1.7 return new AbstractSet<Quad>() { 87 cananian 1.7 public Iterator<Quad> iterator() { 88 cananian 1.7 final Iterator<Quad> it = protectedSet.iterator(); 89 cananian 1.7 return new UnmodifiableIterator<Quad>() { 90 cananian 1.7 public Quad next() { return it.next(); } 91 cananian 1.1.2.11 public boolean hasNext() { return it.hasNext(); } 92 cananian 1.1.2.11 }; 93 cananian 1.1.2.11 } 94 cananian 1.1.2.11 public boolean contains(Object o) { 95 cananian 1.1.2.11 return protectedSet.isProtected((Quad)o); 96 cananian 1.1.2.11 } 97 cananian 1.1.2.11 public int size() { return protectedSet.size(); } 98 cananian 1.1.2.11 }; 99 cananian 1.1.2.1 } 100 cananian 1.1.2.1 101 cananian 1.1.2.2 public Temp[] def() { return new Temp[] { exceptionTemp }; } 102 cananian 1.1.2.2 103 cananian 1.1.2.1 public int kind() { return QuadKind.HANDLER; } 104 cananian 1.1.2.1 105 cananian 1.1.2.4 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 106 cananian 1.1.2.4 return new HANDLER(qqf, this, map(defMap, exceptionTemp), 107 cananian 1.1.2.11 caughtException, new HashProtectSet(protectedSet)); 108 cananian 1.1.2.2 } 109 cananian 1.1.2.4 /* Rename all defined variables in this Quad according to a mapping. 110 cananian 1.1.2.4 * @deprecated does not preserve immutability. */ 111 cananian 1.1.2.2 void renameDefs(TempMap tm) { 112 cananian 1.1.2.2 exceptionTemp = tm.tempMap(exceptionTemp); 113 cananian 1.1.2.1 } 114 cananian 1.1.2.1 115 cananian 1.1.2.9 public void accept(QuadVisitor v) { v.visit(this); } 116 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 117 cananian 1.1.2.1 118 cananian 1.1.2.1 /** Returns human-readable representation of this <Code>Quad</code>. */ 119 cananian 1.1.2.2 public String toString() { 120 cananian 1.1.2.3 return exceptionTemp.toString() + " = HANDLER for " + 121 cananian 1.1.2.3 ((caughtException==null)?"any":caughtException.toString()); 122 cananian 1.1.2.2 } 123 cananian 1.1.2.1 124 cananian 1.1.2.8 /** An interface to specify which <code>Quad</code>s a particular 125 cananian 1.1.2.8 * <code>HANDLER</code> protects. */ 126 cananian 1.1.2.11 public static interface ProtectedSet { 127 cananian 1.1.2.8 /** Determines whether the specified <code>Quad</code> is a 128 cananian 1.1.2.8 * member of the protected set. */ 129 cananian 1.1.2.1 public boolean isProtected(Quad q); 130 cananian 1.1.2.11 /** Iterate through all the elements of the protected set. */ 131 cananian 1.7 public Iterator<Quad> iterator(); 132 cananian 1.1.2.11 /** Return the number of protected quads in the set. */ 133 cananian 1.1.2.11 public int size(); 134 cananian 1.1.2.8 /** Remove a quad from the protected set. */ 135 cananian 1.1.2.5 void remove(Quad q); 136 cananian 1.1.2.8 /** Add a quad into the protected set. */ 137 cananian 1.1.2.5 void insert(Quad q); 138 cananian 1.1.2.11 } 139 cananian 1.1.2.11 /** Within the IR.Quads package, we can use this implementation 140 cananian 1.1.2.11 * of <code>ProtectedSet</code>. */ 141 cananian 1.7 static final class HashProtectSet extends java.util.HashSet<Quad> 142 cananian 1.1.2.11 implements ProtectedSet, Cloneable { 143 cananian 1.1.2.11 HashProtectSet() { super(); } 144 cananian 1.7 HashProtectSet(Set<Quad> s) { super(s); } 145 cananian 1.1.2.11 HashProtectSet(ProtectedSet ps) { 146 cananian 1.7 for (Iterator<Quad> it=ps.iterator(); it.hasNext(); ) 147 cananian 1.7 this.insert(it.next()); 148 cananian 1.1.2.11 } 149 cananian 1.1.2.11 public boolean isProtected(Quad q) { return contains(q); } 150 cananian 1.1.2.11 public void remove(Quad q) { super.remove(q); } 151 cananian 1.1.2.11 public void insert(Quad q) { super.add(q); } 152 cananian 1.1.2.11 /* iterator and size come from the superclass */ 153 cananian 1.1.2.1 } 154 cananian 1.2 }