1 cananian 1.1.2.3 // Constant.java, created Mon Jan 18 22:44:36 1999 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.IR.RawClass;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 /**
 7 cananian 1.1.2.1  * The <code>Constant</code> class represents a single item in
 8 cananian 1.1.2.1  * the constant pool of a class file.  It is a super-class for the
 9 cananian 1.1.2.1  * various specific constant pool item types.
10 cananian 1.1.2.1  * <p>Drawn from <i>The Java Virtual Machine Specification</i>.
11 cananian 1.1.2.1  *
12 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
13 cananian 1.3      * @version $Id: Constant.java,v 1.3 2003/09/05 21:45:16 cananian Exp $
14 cananian 1.1.2.1  * @see ConstantUtf8
15 cananian 1.1.2.1  * @see ConstantInteger
16 cananian 1.1.2.1  * @see ConstantFloat
17 cananian 1.1.2.1  * @see ConstantLong
18 cananian 1.1.2.1  * @see ConstantDouble
19 cananian 1.1.2.1  * @see ConstantClass
20 cananian 1.1.2.1  * @see ConstantString
21 cananian 1.1.2.1  * @see ConstantFieldref
22 cananian 1.1.2.1  * @see ConstantMethodref
23 cananian 1.1.2.1  * @see ConstantInterfaceMethodref
24 cananian 1.1.2.1  * @see ConstantNameAndType
25 cananian 1.1.2.1  */
26 cananian 1.1.2.1 public abstract class Constant {
27 cananian 1.1.2.1   /** ClassFile in which this Constant is found. */
28 cananian 1.1.2.1   protected ClassFile parent;
29 cananian 1.1.2.1 
30 cananian 1.1.2.1   /* See Table 4.2 in The Java Virtual Machine Specification */
31 cananian 1.1.2.1   static final int CONSTANT_Utf8=1;
32 cananian 1.1.2.1   static final int CONSTANT_Integer=3;
33 cananian 1.1.2.1   static final int CONSTANT_Float=4;
34 cananian 1.1.2.1   static final int CONSTANT_Long=5;
35 cananian 1.1.2.1   static final int CONSTANT_Double=6;
36 cananian 1.1.2.1   static final int CONSTANT_Class=7;
37 cananian 1.1.2.1   static final int CONSTANT_String=8;
38 cananian 1.1.2.1   static final int CONSTANT_Fieldref=9;
39 cananian 1.1.2.1   static final int CONSTANT_Methodref=10;
40 cananian 1.1.2.1   static final int CONSTANT_InterfaceMethodref=11;
41 cananian 1.1.2.1   static final int CONSTANT_NameAndType=12;
42 cananian 1.1.2.1 
43 cananian 1.1.2.1   protected Constant(ClassFile parent) { this.parent = parent; }
44 cananian 1.3       public int entrySize() { return 1; } // most constants take up one entry in table
45 cananian 1.1.2.1 
46 cananian 1.1.2.1   /** Read a single Constant item from an input class bytecode file,
47 cananian 1.1.2.1    *  and return an object instance corresponding to it.
48 cananian 1.1.2.1    * @exception java.io.IOException on error reading from input stream.
49 cananian 1.1.2.1    */
50 cananian 1.1.2.1   static public Constant read(ClassFile p, ClassDataInputStream in) 
51 cananian 1.1.2.1        throws java.io.IOException {
52 cananian 1.1.2.1 
53 cananian 1.1.2.1     int tag = in.read_u1();
54 cananian 1.1.2.1     switch(tag) {
55 cananian 1.1.2.1     case CONSTANT_Utf8:
56 cananian 1.1.2.1       return new ConstantUtf8(p, in);
57 cananian 1.1.2.1     case CONSTANT_Integer:
58 cananian 1.1.2.1       return new ConstantInteger(p, in);
59 cananian 1.1.2.1     case CONSTANT_Float:
60 cananian 1.1.2.1       return new ConstantFloat(p, in);
61 cananian 1.1.2.1     case CONSTANT_Long:
62 cananian 1.1.2.1       return new ConstantLong(p, in);
63 cananian 1.1.2.1     case CONSTANT_Double:
64 cananian 1.1.2.1       return new ConstantDouble(p, in);
65 cananian 1.1.2.1     case CONSTANT_Class:
66 cananian 1.1.2.1       return new ConstantClass(p, in);
67 cananian 1.1.2.1     case CONSTANT_String:
68 cananian 1.1.2.1       return new ConstantString(p, in);
69 cananian 1.1.2.1     case CONSTANT_Fieldref:
70 cananian 1.1.2.1       return new ConstantFieldref(p, in);
71 cananian 1.1.2.1     case CONSTANT_Methodref:
72 cananian 1.1.2.1       return new ConstantMethodref(p, in);
73 cananian 1.1.2.1     case CONSTANT_InterfaceMethodref:
74 cananian 1.1.2.1       return new ConstantInterfaceMethodref(p, in);
75 cananian 1.1.2.1     case CONSTANT_NameAndType:
76 cananian 1.1.2.1       return new ConstantNameAndType(p, in);
77 cananian 1.1.2.1     default:
78 cananian 1.1.2.1       throw new Error("Unknown constant type.");
79 cananian 1.1.2.1     }
80 cananian 1.1.2.1   }
81 cananian 1.1.2.1 
82 cananian 1.1.2.1   /** Write a single constant pool item to a class bytecode file. 
83 cananian 1.1.2.1    *  @exception java.io.IOException on error writing to output stream.
84 cananian 1.1.2.1    */
85 cananian 1.1.2.1   abstract public void write(ClassDataOutputStream out)
86 cananian 1.1.2.1     throws java.io.IOException;
87 cananian 1.1.2.1 
88 cananian 1.1.2.1   /** Create a human-readable representation for the Constant. */
89 cananian 1.1.2.1   public String toString() { 
90 cananian 1.1.2.1    return "Unknown Constant";
91 cananian 1.1.2.1   }
92 cananian 1.1.2.1 
93 cananian 1.1.2.1   /** Pretty-print this constant. */
94 cananian 1.1.2.1   public void print(java.io.PrintWriter pw, int indent) {
95 cananian 1.1.2.1     ClassFile.indent(pw, indent, toString());
96 cananian 1.1.2.1   }
97 cananian 1.2     }