1 cananian 1.1.2.1 // QuadStackFrame.java, created Mon Dec 28 17:16:11 1998 by cananian
 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 cananian 1.1.2.1 package harpoon.Interpret.Quads;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.3 import harpoon.ClassFile.HMethod;
 7 cananian 1.1.2.1 import harpoon.IR.Quads.Quad;
 8 cananian 1.1.2.1 import harpoon.Temp.Temp;
 9 cananian 1.1.2.1 import harpoon.Util.Util;
10 cananian 1.1.2.1 
11 cananian 1.1.2.1 import java.util.Hashtable;
12 cananian 1.1.2.1 /**
13 cananian 1.1.2.1  * <code>QuadStackFrame</code> is a stack frame for an interpreted method.
14 cananian 1.1.2.1  * 
15 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
16 cananian 1.2      * @version $Id: QuadStackFrame.java,v 1.2 2002/02/25 21:05:46 cananian Exp $
17 cananian 1.1.2.1  */
18 cananian 1.1.2.1 final class QuadStackFrame extends StackFrame {
19 cananian 1.1.2.1     /** current location in the method. */
20 cananian 1.1.2.1     Quad pc;
21 cananian 1.1.2.1     /** current mapping from <code>Temp</code>s to values. */
22 cananian 1.1.2.1     final Hashtable state = new Hashtable();
23 cananian 1.1.2.1     /** an object to stand for <code>null</code>. */
24 cananian 1.1.2.1     static final private Object Onull = new Object();
25 cananian 1.1.2.1 
26 cananian 1.1.2.1     QuadStackFrame(Quad initial_pc) { this.pc = initial_pc; }
27 cananian 1.1.2.1     void update(Temp t, Object value) {
28 cananian 1.1.2.1         state.put(t, (value==null)?Onull:value);
29 cananian 1.1.2.1     }
30 cananian 1.1.2.1     Object get(Temp t) {
31 cananian 1.1.2.1         Object o = state.get(t);
32 cananian 1.1.2.4         if (o==null)
33 cananian 1.1.2.4             throw new Error("Use before def of "+t+" at " + getMethod() +
34 cananian 1.1.2.4                             "("+ getSourceFile() +":"+ getLineNumber() +")"+
35 cananian 1.1.2.4                             "::" + pc);
36 cananian 1.1.2.1         return (o==Onull)?null:o;
37 cananian 1.1.2.1     }
38 cananian 1.1.2.6     void undefine(Temp t) { state.remove(t); }
39 cananian 1.1.2.1 
40 cananian 1.1.2.2     final HMethod getMethod() { return pc.getFactory().getMethod(); }
41 cananian 1.1.2.1     final String  getSourceFile() { return pc.getSourceFile(); }
42 cananian 1.1.2.1     final int     getLineNumber() { return pc.getLineNumber(); }
43 cananian 1.2     }