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     }