1 cananian 1.1.2.3 // UndefinedRef.java, created Sat Mar 27 17:05:10 1999 by duncan
  2 cananian 1.1.2.2 // Copyright (C) 1998 Duncan Bryce <duncan@lcs.mit.edu>
  3 cananian 1.1.2.2 // 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.ClassFile.HClass;
  7 duncan   1.1.2.1 import harpoon.ClassFile.HField;
  8 duncan   1.1.2.1 import harpoon.ClassFile.HMethod;
  9 duncan   1.1.2.1 import harpoon.IR.Tree.NAME;
 10 duncan   1.1.2.1 import harpoon.Temp.Label;
 11 duncan   1.1.2.1 import harpoon.Util.Util;
 12 duncan   1.1.2.1 
 13 duncan   1.1.2.1 /**
 14 duncan   1.1.2.1  * <code>UndefinedRef</code> is a reference of an unknown type
 15 duncan   1.1.2.1  * 
 16 duncan   1.1.2.1  * @author  Duncan Bryce <duncan@lcs.mit.edu>
 17 cananian 1.2      * @version $Id: UndefinedRef.java,v 1.2 2002/02/25 21:06:01 cananian Exp $
 18 duncan   1.1.2.1  */
 19 duncan   1.1.2.1 public class UndefinedRef extends Ref {
 20 duncan   1.1.2.1     private Integer       length;
 21 duncan   1.1.2.1     private Integer       hashCode;
 22 duncan   1.1.2.1     private ClazPointer   classPtr;
 23 duncan   1.1.2.1 
 24 duncan   1.1.2.1     /** Class constructor. */
 25 duncan   1.1.2.1     public UndefinedRef(StaticState ss) {
 26 duncan   1.1.2.1         this(ss, null, null, null);
 27 duncan   1.1.2.1     }
 28 duncan   1.1.2.1 
 29 duncan   1.1.2.1     /** Class constructor. */
 30 duncan   1.1.2.1     public UndefinedRef(StaticState ss, Integer length, Integer hashCode,
 31 duncan   1.1.2.1                         ClazPointer classPtr) {
 32 duncan   1.1.2.1         super(ss, null);
 33 duncan   1.1.2.1         this.length   = length;
 34 duncan   1.1.2.1         this.hashCode = hashCode==null?new Integer(this.hashCode()):hashCode;
 35 duncan   1.1.2.1         this.classPtr = classPtr;
 36 duncan   1.1.2.1     }
 37 duncan   1.1.2.1 
 38 duncan   1.1.2.1     /** Throws an error. */
 39 duncan   1.1.2.1     public Object get(HField h) {
 40 duncan   1.1.2.1         throw new Error("Dont access UndefinedRef");
 41 duncan   1.1.2.1     }
 42 duncan   1.1.2.1 
 43 duncan   1.1.2.1     public Object clone() {
 44 duncan   1.1.2.1         throw new Error("Dont clone UndefinedRef");
 45 duncan   1.1.2.1     }
 46 duncan   1.1.2.1 
 47 duncan   1.1.2.1     /** Updates the value of <code>ptr</code> to be <code>value</code>. */
 48 duncan   1.1.2.1     static void update(UndefinedPointer ptr, Object value) {
 49 duncan   1.1.2.1         UndefinedRef ref = (UndefinedRef)ptr.getBase();
 50 duncan   1.1.2.1         long offset = ptr.getOffset();
 51 duncan   1.1.2.1         StaticState ss = ref.ss;
 52 duncan   1.1.2.1 
 53 cananian 1.1.2.5         HClass dummy = ss.linker.forName("java.lang.Integer");
 54 cananian 1.1.2.5         HClass dummyA = ss.HCstringA;
 55 duncan   1.1.2.1 
 56 duncan   1.1.2.1         if (ss.map.hashCodeOffset(dummy)==offset) {
 57 duncan   1.1.2.1             // hashcode field isn't used
 58 duncan   1.1.2.1         }
 59 duncan   1.1.2.1         else if (ss.map.lengthOffset(dummyA)==offset) {
 60 duncan   1.1.2.1             ref.length = (Integer)value;
 61 duncan   1.1.2.1             if (ref.classPtr != null) {
 62 duncan   1.1.2.1                 throw new PointerTypeChangedException
 63 duncan   1.1.2.1                     (new ArrayPointer
 64 duncan   1.1.2.1                      (new ArrayRef(ss, 
 65 duncan   1.1.2.1                                    ss.getHClass((Label)ref.classPtr.getBase()),
 66 duncan   1.1.2.1                                    new int[] { ref.length.intValue() },
 67 duncan   1.1.2.1                                    ref.length, ref.hashCode, ref.classPtr),
 68 duncan   1.1.2.1                       0));
 69 duncan   1.1.2.1             }
 70 duncan   1.1.2.1         }
 71 duncan   1.1.2.4         else if (ss.map.clazzPtrOffset(dummy) == offset) {
 72 duncan   1.1.2.1             ref.classPtr = 
 73 duncan   1.1.2.1               new ClazPointer((Label)(((ConstPointer)value).getBase()), ss, 0);
 74 duncan   1.1.2.1 
 75 duncan   1.1.2.1             HClass type = ss.getHClass((Label)ref.classPtr.getBase());
 76 duncan   1.1.2.1             if (type.isArray()) { 
 77 duncan   1.1.2.1                 if (ref.length != null) {
 78 duncan   1.1.2.1                     throw new PointerTypeChangedException
 79 duncan   1.1.2.1                         (new ArrayPointer
 80 duncan   1.1.2.1                          (new ArrayRef(ss, type, 
 81 duncan   1.1.2.1                                        new int[] { ref.length.intValue() },
 82 duncan   1.1.2.1                                        ref.length, ref.hashCode, ref.classPtr),
 83 duncan   1.1.2.1                           0));
 84 duncan   1.1.2.1                 }
 85 duncan   1.1.2.1             }
 86 duncan   1.1.2.1             else {
 87 duncan   1.1.2.1                 throw new PointerTypeChangedException
 88 duncan   1.1.2.1                     (new FieldPointer
 89 duncan   1.1.2.1                      (new ObjectRef(ss, type, ref.hashCode, ref.classPtr),
 90 duncan   1.1.2.1                       0));
 91 duncan   1.1.2.1             }
 92 duncan   1.1.2.1         }
 93 duncan   1.1.2.1         else {
 94 duncan   1.1.2.1             throw new Error
 95 duncan   1.1.2.1                 ("Can only update length & type of an undef Pointer");
 96 duncan   1.1.2.1         }
 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 duncan   1.1.2.1 
104 duncan   1.1.2.1 
105 duncan   1.1.2.1 
106 cananian 1.2