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