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      }