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