1 cananian 1.1.2.1 // Ref.java, created Mon Dec 28 00:29:30 1998 by cananian 2 cananian 1.1.2.2 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.2 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Interpret.Quads; 5 cananian 1.1.2.1 6 cananian 1.1.2.1 import harpoon.ClassFile.HClass; 7 cananian 1.1.2.1 import harpoon.ClassFile.HField; 8 cananian 1.1.2.1 import harpoon.ClassFile.HMethod; 9 cananian 1.1.2.1 import harpoon.Util.Util; 10 cananian 1.1.2.1 11 cananian 1.1.2.1 /** 12 cananian 1.1.2.1 * <code>Ref</code> is an abstract superclass for object and array references. 13 cananian 1.1.2.1 * 14 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 15 cananian 1.3 * @version $Id: Ref.java,v 1.3 2002/04/10 03:05:50 cananian Exp $ 16 cananian 1.1.2.1 */ 17 cananian 1.1.2.3 abstract class Ref implements Cloneable, java.io.Serializable { 18 cananian 1.1.2.1 /** The type of the object. */ 19 cananian 1.1.2.1 final HClass type; 20 cananian 1.1.2.1 /** A pointer to the static state, so we can finalize. */ 21 cananian 1.1.2.1 final StaticState ss; 22 cananian 1.1.2.1 /** A monitor lock. */ 23 cananian 1.1.2.1 //boolean lock; 24 cananian 1.1.2.1 /** Profiling information. */ 25 cananian 1.2.2.1 final long creation_time; 26 cananian 1.1.2.1 27 cananian 1.1.2.1 /** create a new ref. 28 cananian 1.1.2.1 * @exception InterpretedThrowable 29 cananian 1.1.2.1 * if class initializer throws an exception. */ 30 cananian 1.1.2.1 Ref(StaticState ss, HClass type) { 31 cananian 1.1.2.1 this.ss = ss; this.type = type; 32 cananian 1.1.2.1 /*this.lock = false;*/ 33 cananian 1.1.2.1 // load class into StaticState, if needed. 34 cananian 1.1.2.1 if (!ss.isLoaded(type)) ss.load(type); 35 cananian 1.1.2.1 this.creation_time = ss.getInstructionCount(); 36 cananian 1.1.2.1 // yay, done. 37 cananian 1.1.2.1 } 38 cananian 1.1.2.1 39 cananian 1.1.2.1 synchronized void lock() { /* FIXME */ } 40 cananian 1.1.2.1 synchronized void unlock() { /* FIXME */ } 41 cananian 1.1.2.1 42 cananian 1.1.2.1 // arrays have a single final field. 43 cananian 1.1.2.1 abstract Object get(HField f); 44 cananian 1.1.2.1 45 cananian 1.1.2.1 public abstract Object clone(); 46 cananian 1.1.2.1 47 cananian 1.1.2.4 // for profiling only 48 cananian 1.1.2.4 protected abstract int size(); 49 cananian 1.1.2.4 50 cananian 1.1.2.1 protected void finalize() throws Throwable { 51 cananian 1.1.2.1 // profile 52 cananian 1.1.2.4 ss.profile(this.type, this.creation_time, ss.getInstructionCount(), 53 cananian 1.1.2.4 this.size()); 54 cananian 1.1.2.1 // finalize the actual object. 55 cananian 1.1.2.1 super.finalize(); 56 cananian 1.1.2.1 } 57 cananian 1.1.2.1 58 cananian 1.1.2.1 // UTILITY: 59 cananian 1.1.2.1 static final Object defaultValue(HField f) { 60 cananian 1.1.2.1 if (f.isConstant()) return f.getConstant(); 61 cananian 1.1.2.1 return defaultValue(f.getType()); 62 cananian 1.1.2.1 } 63 cananian 1.1.2.1 static final Object defaultValue(HClass ty) { 64 cananian 1.1.2.1 if (!ty.isPrimitive()) return null; 65 cananian 1.1.2.1 if (ty == HClass.Boolean) return new Boolean(false); 66 cananian 1.1.2.1 if (ty == HClass.Byte) return new Byte((byte)0); 67 cananian 1.1.2.1 if (ty == HClass.Char) return new Character((char)0); 68 cananian 1.1.2.1 if (ty == HClass.Double) return new Double(0); 69 cananian 1.1.2.1 if (ty == HClass.Float) return new Float(0); 70 cananian 1.1.2.1 if (ty == HClass.Int) return new Integer(0); 71 cananian 1.1.2.1 if (ty == HClass.Long) return new Long(0); 72 cananian 1.1.2.1 if (ty == HClass.Short) return new Short((short)0); 73 cananian 1.1.2.1 throw new Error("Ack! What kinda default value is this?!"); 74 cananian 1.1.2.1 } 75 cananian 1.2 }