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 }