001 package edu.rice.cs.cunit.classFile.attributes; 002 003 import edu.rice.cs.cunit.classFile.attributes.visitors.IAttributeVisitor; 004 import edu.rice.cs.cunit.classFile.code.instructions.LineNumberTable; 005 import edu.rice.cs.cunit.classFile.constantPool.*; 006 import edu.rice.cs.cunit.classFile.constantPool.visitors.ADefaultPoolInfoVisitor; 007 import edu.rice.cs.cunit.util.Types; 008 009 import java.util.ArrayList; 010 011 /** 012 * Represents the SourceFile attribute in a class file. 013 * 014 * @author Mathias Ricken 015 */ 016 public class ConstantValueAttributeInfo extends AAttributeInfo { 017 /** 018 * Constructor. 019 * 020 * @param name attribute name 021 * @param data attribute data 022 * @param cp constant pool 023 * 024 * @throws ClassFormatError 025 */ 026 public ConstantValueAttributeInfo(AUTFPoolInfo name, byte[] data, ConstantPool cp) throws ClassFormatError { 027 super(name, data, cp); 028 } 029 030 /** 031 * Return the constant value information. 032 * 033 * @return constant value information 034 * 035 * @throws ClassFormatError 036 */ 037 public APoolInfo getConstantValue() throws ClassFormatError { 038 return _constantPool.get(Types.ushortFromBytes(_data, 0)).execute(new ADefaultPoolInfoVisitor<APoolInfo, Object>() { 039 public APoolInfo defaultCase(APoolInfo host, Object o) { 040 throw new ClassFormatError("Variable type item expected for ConstantValue attribute."); 041 } 042 043 public APoolInfo stringCase(StringPoolInfo host, Object o) { 044 return host; 045 } 046 047 public APoolInfo intCase(IntegerPoolInfo host, Object o) { 048 return host; 049 } 050 051 public APoolInfo floatCase(FloatPoolInfo host, Object o) { 052 return host; 053 } 054 055 public APoolInfo longCase(LongPoolInfo host, Object o) { 056 return host; 057 } 058 059 public APoolInfo doubleCase(DoublePoolInfo host, Object o) { 060 return host; 061 } 062 }, null); 063 } 064 065 /** 066 * Set the constant value information. 067 * 068 * @param newConst new constant value information. 069 * 070 * @throws IllegalArgumentException 071 */ 072 public void setConstantValue(APoolInfo newConst) throws IllegalArgumentException { 073 Types.bytesFromShort(_constantPool.indexOf(newConst.execute(new ADefaultPoolInfoVisitor<APoolInfo, Object>() { 074 public APoolInfo defaultCase(APoolInfo host, Object o) { 075 throw new IllegalArgumentException("Variable type item expected for ConstantValue attribute."); 076 } 077 078 public APoolInfo stringCase(StringPoolInfo host, Object o) { 079 return host; 080 } 081 082 public APoolInfo intCase(IntegerPoolInfo host, Object o) { 083 return host; 084 } 085 086 public APoolInfo floatCase(FloatPoolInfo host, Object o) { 087 return host; 088 } 089 090 public APoolInfo longCase(LongPoolInfo host, Object o) { 091 return host; 092 } 093 094 public APoolInfo doubleCase(DoublePoolInfo host, Object o) { 095 return host; 096 } 097 }, null)), _data, 0); 098 } 099 100 /** 101 * Execute a visitor on this attribute. 102 * 103 * @param visitor visitor 104 * @param param visitor-specific parameter 105 * 106 * @return visitor-specific return value 107 */ 108 public <R, D> R execute(IAttributeVisitor<R, D> visitor, D param) { 109 return visitor.constantValueCase(this, param); 110 } 111 112 /** 113 * Adjust program counter values contained in this attribute, starting at startPC, by adding deltaPC to them. 114 * 115 * @param startPC program counter to start at 116 * @param deltaPC change in program counter values 117 */ 118 public void adjustPC(int startPC, int deltaPC) { 119 // nothing to do 120 } 121 122 /** 123 * Translate the program counter values contained in this attribute from an old line number table to a new one. 124 * 125 * @param index critical point (insertion or deletion point) 126 * @param deltaIndex delta value to add to all old line numbers greater than the critical point 127 * @param oldLnt old line number table 128 * @param newLnt new line number table 129 */ 130 public void translatePC(int index, int deltaIndex, LineNumberTable oldLnt, LineNumberTable newLnt) { 131 // nothing to do 132 } 133 134 /** 135 * Creates and returns a copy of this object. 136 */ 137 public Object clone() throws CloneNotSupportedException { 138 return super.clone(); 139 } 140 141 /** 142 * Returns the name of the attribute as it appears in the class file. 143 * 144 * @return name of the attribute. 145 */ 146 public static String getAttributeName() { 147 return "ConstantValue"; 148 } 149 }