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.APoolInfo;
006 import edu.rice.cs.cunit.classFile.constantPool.AUTFPoolInfo;
007 import edu.rice.cs.cunit.classFile.constantPool.ConstantPool;
008 import edu.rice.cs.cunit.classFile.constantPool.visitors.CheckUTFVisitor;
009 import edu.rice.cs.cunit.classFile.ClassFile;
010 import edu.rice.cs.cunit.util.Types;
011
012 import java.util.ArrayList;
013
014 /**
015 * Represents the SourceFile attribute in a class file.
016 *
017 * @author Mathias Ricken
018 */
019 public class SourceFileAttributeInfo extends AAttributeInfo {
020 /**
021 * Constructor.
022 *
023 * @param name attribute name
024 * @param data attribute data
025 * @param cp constant pool
026 *
027 * @throws ClassFormatError
028 */
029 public SourceFileAttributeInfo(AUTFPoolInfo name, byte[] data, ConstantPool cp) throws ClassFormatError {
030 super(name, data, cp);
031 }
032
033 /**
034 * Return the source file name information.
035 *
036 * @return source file name information
037 *
038 * @throws ClassFormatError
039 */
040 public AUTFPoolInfo getSourceFileName() throws ClassFormatError {
041 return _constantPool.get(Types.ushortFromBytes(_data, 0)).execute(CheckUTFVisitor.singleton(), null);
042 }
043
044 /**
045 * Set the source file name information.
046 *
047 * @param newFileName constant pool
048 */
049 public void setSourceFileName(AUTFPoolInfo newFileName) {
050 _data = new byte[2];
051 Types.bytesFromShort(_constantPool.indexOf(newFileName), _data, 0);
052 }
053
054 /**
055 * Execute a visitor on this attribute.
056 *
057 * @param visitor visitor
058 * @param param visitor-specific parameter
059 *
060 * @return visitor-specific return value
061 */
062 public <R, D> R execute(IAttributeVisitor<R, D> visitor, D param) {
063 return visitor.sourceFileCase(this, param);
064 }
065
066 /**
067 * Adjust program counter values contained in this attribute, starting at startPC, by adding deltaPC to them.
068 *
069 * @param startPC program counter to start at
070 * @param deltaPC change in program counter values
071 */
072 public void adjustPC(int startPC, int deltaPC) {
073 // nothing to do
074 }
075
076 /**
077 * Translate the program counter values contained in this attribute from an old line number table to a new one.
078 *
079 * @param index critical point (insertion or deletion point)
080 * @param deltaIndex delta value to add to all old line numbers greater than the critical point
081 * @param oldLnt old line number table
082 * @param newLnt new line number table
083 */
084 public void translatePC(int index, int deltaIndex, LineNumberTable oldLnt, LineNumberTable newLnt) {
085 // nothing to do
086 }
087
088 /**
089 * Creates and returns a copy of this object.
090 */
091 public Object clone() throws CloneNotSupportedException {
092 return super.clone();
093 }
094
095 /**
096 * Return a human-readable version of this attribute.
097 *
098 * @return string
099 */
100 public String toString() {
101 return "Source File = "+getSourceFileName().toString();
102 }
103
104 /**
105 * Returns the name of the attribute as it appears in the class file.
106 *
107 * @return name of the attribute.
108 */
109 public static String getAttributeName() {
110 return "SourceFile";
111 }
112 }