1 cananian 1.1.2.6 // StringPointer.java, created Sat Mar 27 17:05:09 1999 by duncan
 2 cananian 1.1.2.5 // Copyright (C) 1998 Duncan Bryce <duncan@lcs.mit.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.Temp.Label;
 7 duncan   1.1.2.1 import harpoon.Util.Tuple;
 8 duncan   1.1.2.1 
 9 duncan   1.1.2.1 /**
10 duncan   1.1.2.1  * The <code>StringPointer</code> class represents a pointer to an 
11 duncan   1.1.2.1  * string constant.  This pointer can be dereferenced 
12 duncan   1.1.2.1  * with <code>getValue()</code>.
13 duncan   1.1.2.1  *
14 duncan   1.1.2.1  * @author  Duncan Bryce <duncan@lcs.mit.edu>
15 cananian 1.2      * @version $Id: StringPointer.java,v 1.2 2002/02/25 21:06:01 cananian Exp $
16 duncan   1.1.2.1  */
17 duncan   1.1.2.1 public class StringPointer extends Pointer {
18 duncan   1.1.2.1     private StaticState ss;
19 duncan   1.1.2.2     private final Object value;
20 duncan   1.1.2.2     
21 duncan   1.1.2.1     /** Class constructor. */
22 duncan   1.1.2.1     StringPointer(StaticState ss, Label base) {
23 duncan   1.1.2.1         super(new Object[] { base });
24 duncan   1.1.2.1         this.ss = ss;
25 duncan   1.1.2.2         this.value = Method.toNonNativeFormat
26 duncan   1.1.2.2             (ss.makeStringIntern
27 duncan   1.1.2.2              ((String)ss.map.decodeLabel((Label)getBase())));
28 duncan   1.1.2.1     }
29 duncan   1.1.2.1 
30 duncan   1.1.2.1     /** Throws an error, as <code>StringPointer</code>s are constant. */
31 duncan   1.1.2.1     public Pointer add(long offset) {
32 duncan   1.1.2.1         throw new Error("Can't add to a String pointer");
33 duncan   1.1.2.1     }
34 duncan   1.1.2.1 
35 duncan   1.1.2.1     /** Returns true if <code>obj</code> is a <code>StringPointer</code>
36 duncan   1.1.2.1      *  that points to the same location as this <code>StringPointer</code>.
37 duncan   1.1.2.1      */
38 duncan   1.1.2.1     public boolean equals(Object obj) { 
39 cananian 1.1.2.3         StringPointer ptr;
40 cananian 1.1.2.3         if (this==obj) return true;
41 cananian 1.1.2.3         if (null==obj) return false;
42 cananian 1.1.2.3         try { ptr = (StringPointer)obj; }
43 cananian 1.1.2.3         catch (ClassCastException ignore) { return false; }
44 cananian 1.1.2.3         return ptr.getBase()==getBase();
45 duncan   1.1.2.1     }
46 duncan   1.1.2.1 
47 duncan   1.1.2.1     /** Returns a <code>Label</code> representing the base of this
48 duncan   1.1.2.1      *  <code>StringPointer</code>  */
49 duncan   1.1.2.1     public Object getBase() { 
50 duncan   1.1.2.1         return proj(0);
51 duncan   1.1.2.1     }
52 duncan   1.1.2.1 
53 duncan   1.1.2.1     /** Returns the offset of this <code>StringPointer</code>. */
54 duncan   1.1.2.1     public long getOffset() { 
55 duncan   1.1.2.1         throw new Error("String pointers have no offsets");
56 duncan   1.1.2.1     }
57 duncan   1.1.2.1 
58 duncan   1.1.2.1     /** Returns the value obtained by dereferencing this 
59 duncan   1.1.2.1      *  <code>StringPointer</code>.  This value is in non-native format.
60 duncan   1.1.2.1      */
61 duncan   1.1.2.1     public Object getValue() { 
62 duncan   1.1.2.2         return this.value;
63 duncan   1.1.2.1     }
64 duncan   1.1.2.1 
65 duncan   1.1.2.1     /** Always returns true. */
66 duncan   1.1.2.1     public boolean isConst() { return true; }
67 duncan   1.1.2.1 
68 duncan   1.1.2.1     /** Always returns false. */
69 duncan   1.1.2.1     public boolean isDerived() { return false; }
70 duncan   1.1.2.4 
71 duncan   1.1.2.4     /** Returns an integer enumeration of the kind of this Pointer.  The 
72 duncan   1.1.2.4         enumerated values are public fields of the Pointer class.
73 duncan   1.1.2.4     */
74 duncan   1.1.2.4     public int kind() { return Pointer.STRING_PTR; }
75 duncan   1.1.2.1 
76 duncan   1.1.2.1     /** Throws an error, as <code>StringPointer</code>s are constant. */
77 duncan   1.1.2.1     public void updateValue(Object value) { 
78 duncan   1.1.2.1         throw new Error("Can't update String pointer");
79 duncan   1.1.2.1     }
80 duncan   1.1.2.2   
81 duncan   1.1.2.2     public String toString() { 
82 duncan   1.1.2.2         return "StringPointer --> < " + value.toString() + " >";
83 duncan   1.1.2.2     }
84 duncan   1.1.2.1     
85 duncan   1.1.2.1 }
86 duncan   1.1.2.2 
87 duncan   1.1.2.2 
88 duncan   1.1.2.2 
89 cananian 1.2