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