1 cananian 1.1.2.6 // ClazPointer.java, created Sat Mar 27 17:05:07 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.Util.Tuple; 7 duncan 1.1.2.1 import harpoon.Temp.Label; 8 duncan 1.1.2.1 9 duncan 1.1.2.1 /** 10 duncan 1.1.2.1 * The <code>ClazPointer</code> is used to representing a pointer 11 duncan 1.1.2.1 * to static class data. 12 duncan 1.1.2.1 * 13 duncan 1.1.2.1 * @author Duncan Bryce <duncan@lcs.mit.edu> 14 cananian 1.3 * @version $Id: ClazPointer.java,v 1.3 2002/04/10 03:05:56 cananian Exp $ 15 duncan 1.1.2.1 */ 16 duncan 1.1.2.1 class ClazPointer extends Pointer { 17 duncan 1.1.2.1 private boolean isDerived; 18 cananian 1.2.2.1 private final StaticState ss; 19 duncan 1.1.2.1 20 duncan 1.1.2.1 // Private constructor used to add two ClazPointers. 21 duncan 1.1.2.1 private ClazPointer(ClazPointer base, long offset) { 22 duncan 1.1.2.1 this((Label)base.getBase(), base.ss, base.getOffset() + offset, true); 23 duncan 1.1.2.1 } 24 duncan 1.1.2.1 25 duncan 1.1.2.1 // Private constructor used to clone a ClazPointer. 26 pnkfelix 1.1.2.2 private ClazPointer(Label base, final StaticState ss, 27 duncan 1.1.2.1 long offset, boolean isDerived) { 28 duncan 1.1.2.1 super(new Object[] { base, new Long(offset) }); 29 duncan 1.1.2.1 this.ss = ss; 30 duncan 1.1.2.1 this.isDerived = isDerived; 31 duncan 1.1.2.1 } 32 duncan 1.1.2.1 33 duncan 1.1.2.1 /** Class constructor */ 34 pnkfelix 1.1.2.2 ClazPointer(Label base, final StaticState ss, long offset) { 35 duncan 1.1.2.1 this(base, ss, offset, false); 36 duncan 1.1.2.1 } 37 duncan 1.1.2.1 38 duncan 1.1.2.1 /** Adds the specified parameter to this <code>ClazPointer</code>'s 39 duncan 1.1.2.1 * offset */ 40 duncan 1.1.2.1 public Pointer add(long offset) { 41 duncan 1.1.2.1 return new ClazPointer(this, offset); 42 duncan 1.1.2.1 } 43 duncan 1.1.2.1 44 duncan 1.1.2.1 /** Returns true if <code>obj</code> is a <code>ClazPointer</code> which 45 duncan 1.1.2.1 * points to the same location as this <code>ClazPointer</code>. 46 duncan 1.1.2.1 */ 47 duncan 1.1.2.1 public boolean equals(Object obj) { 48 cananian 1.1.2.3 ClazPointer ptr; 49 cananian 1.1.2.3 if (this==obj) return true; 50 cananian 1.1.2.3 if (null==obj) return false; 51 cananian 1.1.2.3 try { ptr = (ClazPointer)obj; } 52 cananian 1.1.2.3 catch (ClassCastException ignore) { return false; } 53 cananian 1.1.2.3 return (((Label)getBase()).toString().equals 54 cananian 1.1.2.3 (((Label)ptr.getBase()).toString())) && 55 cananian 1.1.2.3 getOffset()==ptr.getOffset(); 56 duncan 1.1.2.1 } 57 duncan 1.1.2.1 58 duncan 1.1.2.1 /** Returns a <code>Label</code> representing the base of this 59 duncan 1.1.2.1 * <code>ConstPointer</code>. 60 duncan 1.1.2.1 */ 61 duncan 1.1.2.1 public Object getBase() { return (Label)proj(0); } 62 duncan 1.1.2.1 63 duncan 1.1.2.1 /** Returns the offset of this <code>ClazPointer</code>. */ 64 duncan 1.1.2.1 public long getOffset() { return ((Long)proj(1)).longValue(); } 65 duncan 1.1.2.1 66 duncan 1.1.2.1 /** Dereferences this <code>ClazPointer</code> and returns the value 67 duncan 1.1.2.1 * it points to. */ 68 duncan 1.1.2.1 public Object getValue() { return ss.getValue(this); } 69 duncan 1.1.2.1 70 duncan 1.1.2.1 /** Always returns false. */ 71 duncan 1.1.2.1 public boolean isConst() { return false; } 72 duncan 1.1.2.1 73 duncan 1.1.2.1 /** Returns true if this <code>ClazPointer</code> has been derived from 74 duncan 1.1.2.1 * another <code>ClazPointer</code> */ 75 duncan 1.1.2.1 public boolean isDerived() { return isDerived; } 76 duncan 1.1.2.4 77 duncan 1.1.2.4 /** Returns an integer enumeration of the kind of this Pointer. The 78 duncan 1.1.2.4 enumerated values are public fields of the Pointer class. 79 duncan 1.1.2.4 */ 80 duncan 1.1.2.4 public int kind() { return Pointer.CLAZ_PTR; } 81 duncan 1.1.2.1 82 duncan 1.1.2.1 /** Throws an error, as the program is not supposed to 83 duncan 1.1.2.1 * modify static class data */ 84 duncan 1.1.2.1 public void updateValue(Object obj) { 85 duncan 1.1.2.1 throw new Error("Can't modify claz data!"); 86 duncan 1.1.2.1 } 87 duncan 1.1.2.1 88 duncan 1.1.2.1 /** Returns a human-readable representation of this 89 duncan 1.1.2.1 * <code>ClazPointer</code> */ 90 duncan 1.1.2.1 public String toString() { 91 duncan 1.1.2.1 StringBuffer sb = new StringBuffer("ClazPtr: < "); 92 duncan 1.1.2.1 sb.append(getBase().toString()); 93 duncan 1.1.2.1 sb.append(" , "); 94 duncan 1.1.2.1 sb.append(getOffset()); 95 duncan 1.1.2.1 sb.append(" >"); 96 duncan 1.1.2.1 return sb.toString(); 97 duncan 1.1.2.1 } 98 duncan 1.1.2.1 } 99 duncan 1.1.2.1 100 duncan 1.1.2.1 101 duncan 1.1.2.1 102 duncan 1.1.2.1 103 cananian 1.2