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