1 cananian 1.1.2.6 // TreeStackFrame.java, created Sat Mar 27 17:05:10 1999 by duncan
  2 cananian 1.1.2.5 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.5 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 duncan   1.1.2.1 package harpoon.Interpret.Tree;
  5 duncan   1.1.2.1 
  6 duncan   1.1.2.1 import harpoon.ClassFile.HMethod;
  7 duncan   1.1.2.1 import harpoon.IR.Tree.Exp;
  8 duncan   1.1.2.1 import harpoon.IR.Tree.Stm;
  9 duncan   1.1.2.2 import harpoon.IR.Tree.TEMP;
 10 duncan   1.1.2.1 import harpoon.Temp.Temp;
 11 duncan   1.1.2.1 import harpoon.Util.Util;
 12 duncan   1.1.2.1 
 13 duncan   1.1.2.1 import java.util.Enumeration;
 14 duncan   1.1.2.1 import java.util.Hashtable;
 15 duncan   1.1.2.1 
 16 duncan   1.1.2.1 /**
 17 duncan   1.1.2.1  * <code>TreeStackFrame</code> is a stack frame for an interpreted method.
 18 duncan   1.1.2.1  * 
 19 duncan   1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 20 cananian 1.2      * @version $Id: TreeStackFrame.java,v 1.2 2002/02/25 21:06:01 cananian Exp $
 21 duncan   1.1.2.1  */
 22 duncan   1.1.2.1 final class TreeStackFrame extends StackFrame {
 23 duncan   1.1.2.1     /** current location in the method */
 24 duncan   1.1.2.1     Stm pc;
 25 duncan   1.1.2.1     /** current mapping from <code>Temp</code>s to values. */
 26 duncan   1.1.2.1     final Hashtable state = new Hashtable();
 27 duncan   1.1.2.1     /** an object to stand for <code>null</code>. */
 28 duncan   1.1.2.1     static final private Object Onull = new Object();
 29 duncan   1.1.2.1 
 30 duncan   1.1.2.1     /** Class constructor. */
 31 duncan   1.1.2.1     TreeStackFrame(Stm initial_pc) { this.pc = initial_pc; }
 32 duncan   1.1.2.1 
 33 duncan   1.1.2.1     /** Replaces all instances of <code>obj1</code> in this stack frame
 34 duncan   1.1.2.1      *  with <code>obj2</code>. */
 35 duncan   1.1.2.1     void replace(Object obj1, Object obj2) {
 36 duncan   1.1.2.1         for (Enumeration e = state.keys(); e.hasMoreElements();) {
 37 duncan   1.1.2.1             Object nextKey = e.nextElement();
 38 duncan   1.1.2.1             if (state.get(nextKey).equals(obj1)) {
 39 duncan   1.1.2.1                 state.put(nextKey, obj2);
 40 duncan   1.1.2.1             }
 41 duncan   1.1.2.1         }
 42 duncan   1.1.2.1         if (state.containsKey(obj1)) {
 43 duncan   1.1.2.1             state.put(obj2, state.get(obj1));
 44 duncan   1.1.2.1             state.remove(obj1);
 45 duncan   1.1.2.1         }
 46 duncan   1.1.2.1     }
 47 duncan   1.1.2.1 
 48 duncan   1.1.2.1     void update(Temp t, Object value) {
 49 duncan   1.1.2.4         if (DEBUG) db("Updating: " + t + " --> " + value);
 50 duncan   1.1.2.1         state.put(t, (value==null)?Onull:value);
 51 duncan   1.1.2.1     }
 52 duncan   1.1.2.1      
 53 duncan   1.1.2.1     void update(Exp exp, Object value) {
 54 duncan   1.1.2.4         if (DEBUG) db("Updating: " + exp + " --> " + value);
 55 duncan   1.1.2.1         state.put(exp, (value==null)?Onull:value);
 56 duncan   1.1.2.1     }
 57 duncan   1.1.2.1 
 58 duncan   1.1.2.1     Object get(Temp t) {
 59 duncan   1.1.2.1         Object o = state.get(t);
 60 duncan   1.1.2.1         if (o==null) {
 61 duncan   1.1.2.1             throw new Error("Use before def of "+t+" at " + getMethod() + 
 62 duncan   1.1.2.1                             "("+ getSourceFile() +":"+ getLineNumber() +")"+
 63 duncan   1.1.2.1                             "::" + pc + "\n" + state.toString());
 64 duncan   1.1.2.1         }
 65 duncan   1.1.2.1         return (o==Onull)?Method.TREE_NULL:o;
 66 duncan   1.1.2.1     }
 67 duncan   1.1.2.1 
 68 duncan   1.1.2.1     Object get(Exp e) {
 69 duncan   1.1.2.2         if (e instanceof TEMP) { 
 70 duncan   1.1.2.2             return get(((TEMP)e).temp);
 71 duncan   1.1.2.2         }
 72 duncan   1.1.2.2         else { 
 73 duncan   1.1.2.2             Object o = state.get(e);
 74 duncan   1.1.2.2             if (o==null) {
 75 duncan   1.1.2.2                 throw new Error("Don't yet know the value of "+ e + " at "+ 
 76 duncan   1.1.2.2                                 getMethod() + "("+getSourceFile() + ":"+
 77 duncan   1.1.2.2                                 getLineNumber() + ")" + "::" + pc + "\n" + 
 78 duncan   1.1.2.2                                 state.toString());
 79 duncan   1.1.2.2             }
 80 duncan   1.1.2.2             return (o==Onull)?Method.TREE_NULL:o;
 81 duncan   1.1.2.1         }
 82 duncan   1.1.2.1     }
 83 duncan   1.1.2.1                           
 84 duncan   1.1.2.1     boolean isDefined(Exp e) {
 85 duncan   1.1.2.1         return state.containsKey(e);
 86 duncan   1.1.2.1     }
 87 duncan   1.1.2.1 
 88 cananian 1.1.2.7     final HMethod getMethod() { return ((harpoon.IR.Tree.Code.TreeFactory)pc.getFactory()).getMethod(); }
 89 duncan   1.1.2.1     final String  getSourceFile() { return pc.getSourceFile(); }
 90 duncan   1.1.2.1     final int     getLineNumber() { return pc.getLineNumber(); }
 91 duncan   1.1.2.1 }
 92 duncan   1.1.2.1 
 93 duncan   1.1.2.1 
 94 duncan   1.1.2.1 
 95 duncan   1.1.2.1 
 96 duncan   1.1.2.1 
 97 duncan   1.1.2.1 
 98 duncan   1.1.2.1 
 99 duncan   1.1.2.1 
100 cananian 1.2