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