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